2010-08-19 14 views
7

Ho una tabella con 10 colonne. Voglio restituire tutte le righe per cui Col006 è distinto, ma restituire tutte le colonne ...Selezionare DISTINCT, restituire l'intera riga

Come posso fare questo?

se colonna 6 appare in questo modo:

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

voglio tornare due file, uno dei record con item1 e l'altra con item2, insieme a tutte le altre colonne.

+0

"Col006 è distinto" - rispetto a cosa? –

+0

COL006 ha un valore quindi è distinto ovunque appaia. Intendi veramente "SELEZIONA DISTINTO COL006 DA TAB HAVING COUNT (*) = 1". –

+0

In realtà, cosa intendi con questo, esattamente? – NinjaCat

risposta

9

In SQL Server 2005 e sopra:

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

In SQL Server 2000, a condizione che si disponga di una colonna chiave primaria:

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 
     ) 

Aggiornamento:

verificare la versione e la compatibilità a livello di database:

SELECT @@VERSION 

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

Ciò mi dà: Server: messaggio 156, livello 15, stato 1, riga 2 Sintassi non corretta vicino alla parola chiave 'WITH'. Server: messaggio 195, livello 15, stato 1, riga 4 "ROW_NUMBER" non è un nome di funzione riconosciuto. – NinjaCat

+0

@NinjaCat: quale versione di 'SQL Server' stai usando? – 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

Restituisce anche tutti i record ... Utilizzando MS SQLServer e il campo è varchar (255) – NinjaCat

+0

il temptable ha 1500 record (rispetto ai 10000 record originali). – NinjaCat

+1

Questo equivale a "selezionare * dalla tabella". – Guffa

2

La parola chiave "DISTINCT" in SQL ha il significato di "valore univoco". Se applicato a una colonna in una query, restituirà tante righe dal set di risultati poiché esistono valori unici e diversi per tale colonna. Di conseguenza crea un insieme di risultati raggruppati ei valori di altre colonne sono casuali se non definiti da altre funzioni (come max, min, media, ecc.)

Se intendevi dire che vuoi restituire tutte le righe per quale Col006 ha un valore specifico, quindi utilizzare la clausola "where Col006 = value".

Se intendevi restituire tutte le righe per cui Col006 è diverso da tutti gli altri valori di Col006, devi comunque specificare quale valore è => vedere sopra.

Se si desidera dire che il valore di Col006 può essere valutato solo dopo aver recuperato tutte le righe, utilizzare la clausola "avendo Col006 = valore". Questo ha lo stesso effetto della clausola "where", ma "where" viene applicato quando le righe vengono recuperate dalle tabelle raw, mentre "having" viene applicato una volta che tutti gli altri calcoli sono stati fatti (cioè le funzioni di aggregazione sono state eseguite ecc.) e appena prima che il set di risultati venga restituito all'utente.

UPDATE:

Dopo aver visto la tua modifica, devo sottolineare che se si utilizza uno qualsiasi degli altri suggerimenti, si finirà con valori casuali in tutti gli altri 9 colonne per la riga che contiene il valore "item1" in Col006, a causa del vincolo più avanti nel mio post.

+0

Sì, la casualità non è un problema in questo caso .... – NinjaCat

+2

Non mi interessa quale valore univoco di col006 ... Ho solo bisogno di un'istanza. Ma ci sono oltre 5000 valori diversi per col006. Come posso specificarlo? – NinjaCat

1

È possibile raggruppare Col006 per ottenere i valori distinti, ma in seguito è necessario decidere cosa fare con i record multipli di ciascun gruppo.

È possibile utilizzare gli aggregati per prelevare un valore dai record. Esempio:

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

Se si desidera che i valori a venire da un record specifico in ogni gruppo, è necessario identificare in qualche modo.Esempio di utilizzo Col002 per identificare il record in ogni gruppo:

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 

ho cercato le risposte postato sopra senza fortuna ... ma questo fa il trucco!

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

È possibile utilizzare GROUP BY e MIN() per ottenere il risultato.

Diciamo che avete id come primary_key. E vogliamo ottenere tutti i valori DISTINCT per una colonna diciamo estimated_total, E inoltre è necessario un campione di riga completa con ciascun valore distinto in SQL. La seguente query dovrebbe fare il trucco.

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