2012-09-20 13 views
32

Ho un set di dati che contiene le colonne Date, Cat e QTY. Quello che voglio fare è aggiungere una colonna univoca che conta solo i valori unici Cat quando fa il conteggio delle righe. Questo è quello che voglio il mio risultato insieme a guardare come:row_number() Raggruppa per?

enter image description here

Utilizzando la query SQL di seguito, sono in grado di ottenere fila utilizzando la funzione row_number().

Tuttavia, non riesco a ottenere quella colonna univoca che ho raffigurato sopra. Quando aggiungo il gruppo alla clausola OVER, non funziona. Qualcuno ha qualche idea su come posso far funzionare questa colonna di conteggi unica?

SELECT 
    Date,  
    ROW_NUMBER() OVER (PARTITION BY Date ORDER By Date, Cat) as ROW, 
    Cat, 
    Qty 
FROM SOURCE 

risposta

13
DENSE_RANK() OVER (PARTITION BY date ORDER BY cat) 
+0

Grazie, questo è un passo nella giusta direzione. Tuttavia, il fatto è che il mio attuale set di dati non è ordinato da cat. Sai come funzionerebbe in quell'esempio? (Immagina che nella colonna del mio gatto, il DEF venga prima dell'ABC, ma è vero che i valori DEF sono tutti consecutivi nel mio ordine quindi non vedresti DEF, DEF, ABC, ABC, DEF come valori nella colonna cat) – user1582928

+2

@ user1582928 As per http://msdn.microsoft.com/en-us/library/ms173825.aspx " Determina l'ordine in cui la funzione DENSE_RANK viene applicata alle righe in una partizione". E puoi sempre aggiungere ORDER BY alla fine di SELECT. – prashanth

+0

@ user1582928, se lo desideri puoi specificare una funzione per cambiare l'ordine, ad esempio: ordina per decodifica ('DEF', 1, 'ABC', 2,3) –

31

Ecco soluzione alternativa.

Non è necessario preoccuparsi dell'ordine di Cat. Usando il seguente SQL sarai in grado di ottenere valori unici per la tua combinazione di date & cat.

SELECT 
    Date,  
    ROW_NUMBER() OVER (PARTITION BY Date, Cat ORDER By Date, Cat) as ROW, 
    Cat, 
    Qty 
FROM SOURCE