78 votes

sélectionner des lignes uniques en fonction d'une seule colonne distincte

Je veux sélectionner des lignes qui ont un distinct email , voir l'exemple de tableau ci-dessous :

 +----+---------+-------------------+-------------+
| id | title   | email             | commentname |
+----+---------+-------------------+-------------+
|  3 | test    | rob@hotmail.com   | rob         |
|  4 | i agree | rob@hotmail.com   | rob         |
|  5 | its ok  | rob@hotmail.com   | rob         |
|  6 | hey     | rob@hotmail.com   | rob         |
|  7 | nice!   | simon@hotmail.com | simon       |
|  8 | yeah    | john@hotmail.com  | john        |
+----+---------+-------------------+-------------+

Le résultat souhaité serait :

 +----+-------+-------------------+-------------+
| id | title | email             | commentname |
+----+-------+-------------------+-------------+
|  3 | test  | rob@hotmail.com   | rob         |
|  7 | nice! | simon@hotmail.com | simon       |
|  8 | yeah  | john@hotmail.com  | john        |
+----+-------+-------------------+-------------+

Où je me fiche de la valeur de colonne id Quel serait le SQL requis ?

101voto

Turbot Points 2337

Un rapide dans TSQL

 SELECT a.*
FROM emails a
INNER JOIN 
  (SELECT email,
    MIN(id) as id
  FROM emails 
  GROUP BY email 
) AS b
  ON a.email = b.email 
  AND a.id = b.id;

36voto

Adam Robinson Points 88472

Je suppose que vous voulez dire que vous ne vous souciez pas de la ligne utilisée pour obtenir les title , id et commentname (vous avez "rob" pour toutes les lignes, mais je ne sais pas si c'est réellement quelque chose qui serait appliqué ou non dans votre modèle de données). Si tel est le cas, vous pouvez utiliser des fonctions de fenêtrage pour renvoyer la première ligne d'une adresse e-mail donnée :

 select
    id,
    title,
    email,
    commentname

from
(
select 
    *, 
    row_number() over (partition by email order by id) as RowNbr 

from YourTable
) source

where RowNbr = 1

2voto

sll Points 30638

Puisque vous ne vous souciez pas de l'identifiant à retourner, je m'en tiens à l'identifiant MAX pour chaque e-mail afin de simplifier la requête SQL, essayez-le

 ;WITH ue(id)
 AS
 (
   SELECT MAX(id)
   FROM table
   GROUP BY email
 )
 SELECT * FROM table t
 INNER JOIN ue ON ue.id = t.id

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X