2010-08-19 6 views
7

J'ai une table avec 10 colonnes. Je veux retourner toutes les lignes pour lesquelles Col006 est distinct, mais retourner toutes les colonnes ...Sélectionnez DISTINCT, retour ligne entière

Comment est-ce que je peux faire ceci?

si la colonne 6 apparaît comme ceci:

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

Je veux revenir deux lignes, l'un des enregistrements avec Item1 et l'autre avec item2, ainsi que toutes les autres colonnes.

+0

"Col006 est distinct" - comparé à quoi? –

+0

COL006 a une valeur donc il est distinct partout où il apparaît. Voulez-vous vraiment dire "SELECT DISTINCT COL006 FROM TAB AYANT COMPTE (*) = 1". –

+0

En fait, qu'est-ce que vous entendez par là, exactement? – NinjaCat

Répondre

9

En SQL Server 2005 et au-dessus:

;WITH q AS 
     (
     SELECT *, ROW_NUMBER() OVER (PARTITION BY col6 ORDER BY id) rn 
     FROM mytable 
     ) 
SELECT * 
FROM q 
WHERE rn = 1 

En SQL Server 2000, à condition que vous avez une colonne de clé primaire:

SELECT mt.* 
FROM (
     SELECT DISTINCT col6 
     FROM mytable 
     ) mto 
JOIN mytable mt 
ON  mt.id = 
     (
     SELECT TOP 1 id 
     FROM mytable mti 
     WHERE mti.col6 = mto.col6 
     -- ORDER BY 
     --  id 
     -- Uncomment the lines above if the order matters 
     ) 

Mise à jour:

Vérifiez votre version base de données et le niveau de compatibilité:

SELECT @@VERSION 

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

Cela me donne: Serveur: Msg 156, Niveau 15, État 1, Ligne 2 Syntaxe incorrecte près du mot-clé 'WITH'. Serveur: Msg 195, niveau 15, état 1, ligne 4 'ROW_NUMBER' n'est pas un nom de fonction reconnu. – NinjaCat

+0

@NinjaCat: quelle version de 'SQL Server' utilisez-vous? – Quassnoi

+0

MS SQL Server 2005 – NinjaCat

-1
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 
+1

Cela retourne tous les enregistrements aussi ... En utilisant MS SQLServer, et le champ est varchar (255) – NinjaCat

+0

la tenttable a 1500 enregistrements (sur les 10000 enregistrements d'origine). – NinjaCat

+1

Cela fait la même chose que simplement 'select * from table'. – Guffa

2

Le mot clé "DISTINCT" dans SQL a la signification de "valeur unique". Lorsqu'il est appliqué à une colonne dans une requête, il retournera autant de lignes du jeu de résultats comme il y a des valeurs uniques, différentes pour cette colonne. Par conséquent, il crée un ensemble de résultats groupés et les valeurs des autres colonnes sont aléatoires sauf si elles sont définies par d'autres fonctions (telles que max, min, average, etc.)

Si vous vouliez dire que vous souhaitez renvoyer toutes les lignes pour Col006 a une valeur spécifique, puis utilisez la clause "where Col006 = value". Si vous vouliez dire que vous voulez retourner toutes les lignes pour lesquelles Col006 est différent de toutes les autres valeurs de Col006, alors vous devez toujours spécifier quelle est cette valeur => voir ci-dessus.

Si vous voulez dire que la valeur de Col006 ne peut être évaluée qu'une fois que toutes les lignes ont été récupérées, utilisez la clause "ayant Col006 = valeur". Cela a le même effet que la clause "where", mais "where" est appliqué lorsque les lignes sont extraites des tables brutes, alors que "having" est appliqué une fois que tous les autres calculs ont été faits (ie fonctions d'agrégation ont été exécutées etc.) et juste avant que l'ensemble de résultats ne soit retourné à l'utilisateur.

MISE À JOUR:

Après avoir vu votre édition, je dois souligner que si vous utilisez l'un des autres suggestions, vous allez vous retrouver avec des valeurs aléatoires dans toutes les autres 9 colonnes pour la ligne qui contient la valeur "item1" dans Col006, en raison de la contrainte plus haut dans mon message.

+0

Oui, le hasard n'est pas un problème dans ce cas .... – NinjaCat

+2

Je me fiche de la 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 le spécifier? – NinjaCat

1

Vous pouvez grouper sur Col006 pour obtenir les valeurs distinctes, mais vous devez ensuite décider quoi faire avec les enregistrements multiples dans chaque groupe.

Vous pouvez utiliser des agrégats pour choisir une valeur dans les enregistrements. Exemple:

select Col006, min(Col001), max(Col002) 
from TheTable 
group by Col006 
order by Col006 

Si vous voulez que les valeurs proviennent d'un enregistrement spécifique dans chaque groupe, vous devez l'identifier en quelque sorte.Exemple d'utilisation COL002 pour identifier l'enregistrement dans chaque groupe:

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
SELECT * 
FROM (SELECT DISTINCT YourDistinctField FROM YourTable) AS A 
CROSS APPLY 
(SELECT TOP 1 * FROM YourTable B 
    WHERE B.YourDistinctField = A.YourDistinctField) AS NewTableName 

J'ai essayé les réponses ci-dessus affichés avec pas de chance ... mais le tour est joué!

0
select * from yourTable where column6 in (select distinct column6 from yourTable); 
0

Vous pouvez utiliser GROUP BY et MIN() pour obtenir le résultat.

Disons que vous avez id comme primary_key. Et nous voulons obtenir toutes les valeurs DISTINCT pour une colonne laisse dire estimated_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 l'affaire.

SELECT *, min(id) 
FROM harvest 
GROUP BY estimated_total; 
Questions connexes