web-dev-qa-db-fra.com

Élimination des valeurs en double basées sur une seule colonne du tableau

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:

enter image description here

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

25
Ned

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

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;
8
Mikhail Makarov