Ma requête:
SELECT sites.siteName, sites.siteIP, history.date
FROM sites INNER JOIN
history ON sites.siteName = history.siteName
ORDER BY siteName,date
Première partie de la sortie:
Comment puis-je supprimer les doublons dans la colonne siteName
? Je veux ne laisser que la mise à jour basée sur la colonne date
.
Dans l'exemple de sortie ci-dessus, j'ai besoin des lignes 1, 3, 6, 10
C'est là que la fonction de fenêtre row_number()
est utile:
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
D'après votre exemple, il semble raisonnable de supposer que la colonne siteIP
est déterminée par la colonne siteName
(c'est-à-dire que chaque site n'a qu'un siteIP
). Si tel est effectivement le cas, il existe une solution simple utilisant 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;
Cependant, si mon hypothèse n'est pas correcte (c'est-à-dire qu'il est possible pour un site d'avoir plusieurs siteIP
), il n'est pas clair pour vous de vous demander quelle siteIP
vous voulez que la requête renvoie dans la deuxième colonne. Si n'importe quel siteIP
, la requête suivante fera l'affaire:
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;