2013-07-06 6 views
18

Meine Frage:Beseitigung doppelte Werte auf Basis von nur einer Spalte der Tabelle

SELECT sites.siteName, sites.siteIP, history.date 
FROM sites INNER JOIN 
    history ON sites.siteName = history.siteName 
ORDER BY siteName,date 

Erster Teil des Ausgangs:

enter image description here

Wie kann ich die Duplikate in siteName Spalte entfernen? Ich möchte nur die aktualisierte Spalte basierend auf date verlassen.

Im Beispiel Ausgabe oben, muss ich die Zeilen 1, 3, 6, 10

Antwort

20

Hier wird das Funktionsfenster row_number() praktisch ist:

SELECT s.siteName, s.siteIP, h.date 
FROM sites s INNER JOIN 
    (select h.*, row_number() over (partition by siteName order by date desc) as seqnum 
     from history h 
    ) h 
    ON s.siteName = h.siteName and seqnum = 1 
ORDER BY s.siteName, h.date 
+3

Könnten Sie die Abfrage ein wenig erklären? – JacksOnF1re

+5

@ JacksOnF1re. . . Weißt du was 'row_number()' tut? Es zählt Zeilen in einer Gruppe auf (definiert durch die Klausel 'partition by'). Die Reihenfolge basiert auf der 'Order by'-Klausel. Wenn Sie den Wert 1 auswählen, wird nur eine Zeile pro Gruppe ausgewählt. Dies ist die Gruppe mit dem größten Datum. –

7

Von Ihrem Beispiel scheint es sinnvoll zu Angenommen, die Spalte siteIP wird durch die Spalte siteName festgelegt (dh jede Site hat nur eine siteIP). Wenn dies tatsächlich der Fall ist, dann ist es eine einfache Lösung mit group by:

select 
    sites.siteName, 
    sites.siteIP, 
    max(history.date) 
from sites 
inner join history on 
    sites.siteName=history.siteName 
group by 
    sites.siteName, 
    sites.siteIP 
order by 
    sites.siteName; 

Allerdings, wenn meine Annahme nicht korrekt ist (das heißt, es ist möglich, dass eine Website auf mehr siteIP hat), dann ist es nicht klar von Ihnen Frage, welche siteIP Sie möchten, dass die Abfrage in der zweiten Spalte zurückgibt. Wenn nur irgendein siteIP, dann wird die folgende Abfrage tun:

select 
    sites.siteName, 
    min(sites.siteIP), 
    max(history.date) 
from sites 
inner join history on 
    sites.siteName=history.siteName 
group by 
    sites.siteName 
order by 
    sites.siteName; 
Verwandte Themen