2016-04-04 9 views
0

In SQL habe ich eine Tabelle, in der eine Spalte doppelte Werte haben kann. Wie wähle ich nur den letzten doppelten Wert aus? Die Daten werden verteilt über einen MonatFür doppelte Werte in SQL, wie wähle ich den letzten doppelten Wert

Dies ist mein aktueller Code, der nicht für die doppelten Werte nicht berücksichtigen (Hinweis: COLUMN1 ist die Spalte, die doppelten Werte hat)

select count(distinct COLUMN1) 
from TABLE 
where extract(month from DATE_COLUMN) = extract(month from sysdate) - 1 
and extract(year from DATE_COLUMN) = extract(year from sysdate) 
and COLUMN1 not like '%X'; 

Dank

Antwort

1

Sie kann die Funktion ROW_NUMBER() in einer Unterabfrage verwenden, um Duplikate zu identifizieren und sie nach einer Datumsspalte zu sortieren. Ich bin mit Oracle nicht bekannt, aber es sollte wie folgt sein:

SELECT ROW_NUMBER() OVER(PARTITION BY COLUMN1 ORDER BY DATE_COLUMN DESC) 

Schauen Sie sich diesen Link für eine Erklärung: https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions137.htm

1

Sie können die ROW_NUMBER() analytische Funktion verwenden, um die letzte Reihe zu bekommen für jeder Wert von column1:

SELECT * 
FROM (
    SELECT t.*, 
     ROW_NUMBER() OVER (PARTITION BY column1 
          ORDER BY date_column DESC) AS rn 
    FROM table_name 
) 
WHERE rn = 1; 
1

endete ich als die mir vorgeschlagen, diejenigen, tun dies auf eine andere Art und Weise auf. Ich habe im Grunde eine Tabelle erstellt, die aus zwei verschiedenen Tabellen kompromittiert wurde, eine mit den doppelten Werten und eine ohne.

select DATECOLUMN, count(COLUMN1) 
FROM (select COLUMN1, max(DATECOLUMN) "DATECOLUMN" 
     from TABLE 
     where extract(month from DATECOLUMN) = extract(month from sysdate) - 1 
     and extract(year from DATECOLUMN) = extract(year from sysdate) 
     group by COLUMN1 
     HAVING count(COLUMN1) > 1 
     UNION 
     select COLUMN1, max(DATECOLUMN) "DATECOLUMN" 
     from TABLE 
     where extract(month from DATECOLUMN) = extract(month from sysdate) - 1 
     and extract(year from DATECOLUMN) = extract(year from sysdate) 
     group by COLUMN1 
     HAVING count(COLUMN1) < 2) "NEW_TABLE" 
where COLUMN1 not like '%X' 
group by DATECOLUMN 
order by DATECOLUMN;