SQL-sélectionner distinct seulement sur une colonne [dupliquer]

cette question a déjà une réponse ici:

j'ai cherché partout une réponse à ce problème. J'utilise un serveur Microsoft SQL, supposons que j'ai une table qui ressemble comme ceci:

+--------+---------+-------------+-------------+
| ID     | NUMBER  | COUNTRY     | LANG        |
+--------+---------+-------------+-------------+
| 1      | 3968    | UK          | English     |
| 2      | 3968    | Spain       | Spanish     |
| 3      | 3968    | USA         | English     |
| 4      | 1234    | Greece      | Greek       |
| 5      | 1234    | Italy       | Italian     |

je veux effectuer une requête qui ne sélectionne que la colonne unique 'Nombre' (que ce soit la première ou la dernière ligne ne me dérange pas). Donc cela me donnerait:

+--------+---------+-------------+-------------+
| ID     | NUMBER  | COUNTRY     | LANG        |
+--------+---------+-------------+-------------+
| 1      | 3968    | UK          | English     |
| 4      | 1234    | Greece      | Greek       |

Comment est-ce réalisable?

39
demandé sur Kyle Hale 2013-12-05 20:59:25

3 réponses

comme vous vous en fichez, j'ai choisi l'ID max pour chaque numéro.

select tbl.* from tbl
inner join (
select max(id) as maxID, number from tbl group by number) maxID
on maxID.maxID = tbl.id

Interrogation Explication

 select 
    tbl.*  -- give me all the data from the base table (tbl) 
 from 
    tbl    
    inner join (  -- only return rows in tbl which match this subquery
        select 
            max(id) as maxID -- MAX (ie distinct) ID per GROUP BY below
        from 
            tbl 
        group by 
            NUMBER            -- how to group rows for the MAX aggregation
    ) maxID
        on maxID.maxID = tbl.id -- join condition ie only return rows in tbl 
                                -- whose ID is also a MAX ID for a given NUMBER
34
répondu Kyle Hale 2016-01-16 02:49:24

une approche très typique de ce type de problème est d'utiliser row_number() :

select t.*
from (select t.*,
             row_number() over (partition by number order by id) as seqnum
      from t
     ) t
where seqnum = 1;

c'est plus généralisable que d'utiliser une comparaison à l'id minimum. Par exemple, vous pouvez obtenir une ligne aléatoire en utilisant order by newid() . Vous pouvez sélectionner 2 lignes en utilisant where seqnum <= 2 .

54
répondu Gordon Linoff 2013-12-05 17:15:22

vous utiliserez la requête suivante:

SELECT * FROM [table] GROUP BY NUMBER;

[table] est le nom du tableau.

il s'agit d'une liste unique pour la colonne NUMBER , mais les autres colonnes peuvent être dénuées de sens selon la mise en œuvre du fournisseur, ce qui veut dire qu'elles peuvent ne pas correspondre ensemble à une ou des lignes spécifiques.

0
répondu Gedalya 2015-05-18 12:37:14