10
votes

Sélectionnez Distinct, retourne entière ligne

J'ai une table avec 10 colonnes. Je veux retourner toutes les lignes pour lesquelles Col006 est distinct, mais renvoie toutes les colonnes ...

Comment puis-je faire cela? P>

Si la colonne 6 apparaît comme suit: P>

| Column 6 |
| item1    | 
| item1    | 
| item2    | 
| item1    | 


6 commentaires

"COL006 est distinct" - comparé à quoi?


COL006 a une valeur donc distincte où qu'elle apparaisse. Voulez-vous vraiment dire "Sélectionnez COL006 distinct de l'onglet comptant (*) = 1".


En fait, qu'entendez-vous par là, exactement?


OK, distinct n'est clairement pas le bon outil à utiliser dans cette situation ....


Comment savez-vous quelle ligne 1 ligne à ramener?


Dans ce cas particulier, peu importe.


7 Réponses :


-1
votes
create table #temp
(C1 TINYINT,
 C2 TINYINT,
 C3 TINYINT,
 C4 TINYINT,
 C5 TINYINT,
 C6 TINYINT)

INSERT INTO #temp
 SELECT 1,1,1,1,1,6
 UNION ALL SELECT 1,1,1,1,1,6
 UNION ALL SELECT 3,1,1,1,1,3
 UNION ALL SELECT 4,2,1,1,1,6

SELECT * FROM #temp

SELECT *
FROM(
SELECT ROW_NUMBER() OVER (PARTITION BY C6 Order by C1) ID,* FROM #temp
)T
WHERE ID = 1

3 commentaires

Cela renvoie toutes les enregistrements aussi ... à l'aide de MS SQLSERVER, et le champ est Varchar (255)


Le tentable a 1500 enregistrements (hors des enregistrements de 10000 originaux).


Cela fait la même chose que juste sélectionner * à partir de la table .



2
votes

Le mot clé "distinct" en SQL a la signification de "valeur unique". Lorsqu'elle est appliquée sur une colonne dans une requête, elle reviendra autant de lignes du résultat définies car il existe des valeurs différentes, différentes pour cette colonne. En conséquence, il crée un ensemble de résultats groupé et les valeurs d'autres colonnes sont aléatoires sauf si définies par d'autres fonctions (telles que Max, min, moyenne, etc.)

Si vous vouliez dire que vous voulez renvoyer toutes les lignes pour lesquelles COL006 a une valeur spécifique, utilisez la clause "Où COL006 = VALUE".

Si vous vouliez dire que vous voulez retourner toutes les lignes pour lesquelles COL006 est différente de toutes les autres valeurs de COL006, vous devez toujours spécifier ce que cette valeur est => voir ci-dessus.

Si vous voulez dire que la valeur de COL006 ne peut être évaluée que lorsque toutes les lignes ont été récupérées, utilisez la clause "Ayant COL006 = VALUE". Cela a le même effet que la clause "où", mais "où" est appliquée lorsque des lignes sont extraites des tables brutes, tandis que "avoir" est appliqué une fois que tous les autres calculs ont été effectués (c.-à-d. Les fonctions d'agrégation ont été exécutées, etc.) et juste avant que l'ensemble de résultats ne soit renvoyé à l'utilisateur.

mise à jour:

Après avoir vu votre édition, je dois souligner que si vous utilisez l'une des autres suggestions, vous vous retrouverez avec des valeurs aléatoires dans toutes les 9 autres colonnes pour la ligne contenant la valeur "Item1" dans Col006, due à la contrainte plus loin dans mon post.


1 commentaires

Je me fiche de quelle valeur unique de Col006 ... J'ai juste besoin d'une instance. Mais il y a plus de 5000 valeurs différentes pour COL006. Comment puis-je préciser cela?



1
votes

Vous pouvez grouper sur COL006 code> pour obtenir les valeurs distinctes, mais vous devez alors décider quoi faire avec les multiples enregistrements de chaque groupe.

Vous pouvez utiliser des agrégats pour choisir une valeur de les enregistrements. Exemple: p> xxx pré>

Si vous souhaitez que les valeurs proviennent d'un enregistrement spécifique de chaque groupe, vous devez l'identifier d'une manière ou d'une autre. Exemple d'utilisation de COL002 pour identifier l'enregistrement dans chaque groupe: P>

select Col006, Col001, Col002
from TheTable t
inner join (
  select Col006, min(Col002)
  from TheTable
  group by Col006
) x on t.Col006 = x.Col006 and t.Col002 = x.Col002
order by Col006


0 commentaires

10
votes

in SQL Server 2005 Code> et ci-dessus: xxx pré>

in SQL Server 2000 code>, à condition que vous avez une colonne de clé primaire: xxx pré>

mise à jour: strong> p>

Vérifiez votre version de la base de données et votre niveau de compatibilité: P>

SELECT  @@VERSION

SELECT  COMPATIBILITY_LEVEL
FROM    sys.databases
WHERE   name = DB_NAME()


4 commentaires

Cela me donne: serveur: msg 156, niveau 15, état 1, ligne 2 Syntaxe incorrecte près du mot clé "avec". Serveur: MSG 195, niveau 15, État 1, ligne 4 'Row_Number' n'est pas un nom de fonction reconnu.


@Ninjacat: quelle version de SQL Server utilisez-vous?


@Ninjacat: Pourriez-vous s'il vous plaît préparer avec avec un point-virgule et réessayer? Si cela échoue, pourriez-vous poster votre requête exactement comme vous l'exécutez?


J'allais poster des réponses très similaires. - mon échec.



1
votes
SELECT *
FROM (SELECT DISTINCT YourDistinctField FROM YourTable) AS A
CROSS APPLY 
( SELECT TOP 1 * FROM YourTable B 
  WHERE B.YourDistinctField = A.YourDistinctField ) AS NewTableName
I tried the answers posted above with no luck... but this does the trick!

0 commentaires

3
votes
select * from yourTable where column6 in (select distinct column6 from yourTable);

0 commentaires

1
votes

Vous pouvez utiliser groupe par et min () pour obtenir le résultat.

permet de dire que vous avez comme le Code> primaire_key . Et nous voulons obtenir tous les valeurs distincts pour une colonne permet de dire estimé_total , et vous avez également besoin d'un échantillon de ligne complète avec chaque valeur distincte dans SQL . La requête suivante devrait faire le tour. xxx


0 commentaires