Comment sélectionner des enregistrements uniques par SQL
Quand j'exécute "SELECT * from table" j'ai obtenu des résultats comme ci-dessous:
1 item1 data1
2 item1 data2
3 item2 data3
4 item3 data4
Comme vous pouvez le voir, il y a des dossiers de dup de colonne2 (item1 sont dupped). Alors, comment pourrais-je obtenir de résultat comme ceci:
1 item1 data1
2 item2 data3
3 item3 data4
Un seul enregistrement sont renvoyés à partir de la double, avec le reste des enregistrements uniques.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
SELECT DISTINCT
ouGROUP BY
pour ce faire.ou
GROUP BY
sera plus utile si vous souhaitez utiliser certaines fonctions d'agrégation commeCOUNT()
ouSUM()
Si vous avez besoin seulement de supprimer les doublons puis utilisez
DISTINCT
.GROUP BY
doit être utilisé pour appliquer des opérateurs d'agrégation pour chaque groupeGROUPE PAR v DISTINCTES
Cela dépend de la rown vous voulez renvoyer pour chaque élément unique. Vos données semble indiquer que le minimum de données de valeur, de sorte que dans cette instance de SQL Server.
suffit d'utiliser une jointure interne, car group by ne fonctionne pas avec plusieurs colonnes en disant ne figure pas dans une fonction d'agrégation.
Je trouve que si je ne peux pas utiliser DISTINCT pour une raison quelconque, puis de les regrouper PAR la volonté de travail.
Il y a 4 méthodes que vous pouvez utiliser:
Considérons l'exemple suivant
TABLE
avec des données de test:Option 1: SELECT DISTINCT
C'est le plus simple et direct, mais aussi la plus limitée:
Option 2: GROUPE PAR
Groupement vous permet d'ajouter des données agrégées, comme le
min(id)
,max(id)
,count(*)
, etc:Option 3: Une Sous-Requête
Utilisant une sous-requête, vous pouvez d'abord identifier les doublons de lignes à ignorer, puis filtrer dans la requête externe avec le
WHERE NOT IN (subquery)
construire:Option 4: Expression de Table Commune avec la fonction ROW_NUMBER()
Dans l'Expression de Table Commune (CTE), sélectionnez la fonction ROW_NUMBER(), partitionné par le groupe de la colonne et ordonné dans l'ordre souhaité. Ensuite, SÉLECTIONNEZ uniquement les enregistrements qui ont
ROW_NUMBER() = 1
:Pour obtenir toutes les colonnes dans votre résultat, vous avez besoin de mettre quelque chose comme:
il un que la première colonne et le reste sera de TOUTES les colonnes dans le même ordre que votre définition. C'est, colonne un sera répété.
select distinct * from ...
Sélectionnez Eff_st
à partir de
(
sélectionnez EFF_ST,ROW_NUMBER() over(PARTITION BY eff_st) XYZ
-
de ABC.CODE_DIM
)
où XYZ= 1
commande par EFF_ST récupérer les 5 premières ligne uniquement