it-swarm.com.de

Eliminieren doppelter Werte basierend auf nur einer Tabellenspalte

Meine Frage:

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

Erster Teil der Ausgabe:

enter image description here

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

In der obigen Beispielausgabe benötige ich die Zeilen 1, 3, 6, 10

25
Ned

Hier bietet sich die Fensterfunktion row_number() an:

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
27
Gordon Linoff

In Ihrem Beispiel kann man davon ausgehen, dass die Spalte siteIP durch die Spalte siteName bestimmt wird (dh, dass jede Site nur eine siteIP enthält). Wenn dies tatsächlich der Fall ist, gibt 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;

Wenn jedoch meine Annahme nicht korrekt ist (d. H., Eine Site kann mehrere siteIP haben), ist aus Ihrer Frage nicht ersichtlich, welche siteIP die Abfrage zurückgeben soll in der zweiten Spalte. Wenn gerade 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;
8
Mikhail Makarov