2012-09-20 13 views
32

Mam zestaw danych, który zawiera kolumny Date, Cat i QTY. Co chcę zrobić, to dodać unikalną kolumnę, która liczy tylko unikalne wartości Cat, gdy robi liczbę wierszy. To jest to, co chcę mój wynik zestaw wyglądać:row_number() Grupa według?

enter image description here

Za pomocą zapytania SQL poniżej, jestem w stanie uzyskać wiersz za pomocą funkcji row_number().

Jednak nie mogę uzyskać tej wyjątkowej kolumny, którą przedstawiłem powyżej. Dodanie grupy do klauzuli OVER nie działa. Czy ktokolwiek ma jakieś pomysły, w jaki sposób mogę uzyskać tę unikalną kolumnę do liczenia?

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

Odpowiedz

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

Dzięki, to krok we właściwym kierunku. Jednak faktem jest, że mój aktualny zestaw danych nie jest zamówiony przez kota. Czy wiesz, jak to by działało w tym przykładzie? (Wyobraź sobie, że w mojej kolumnie cat DEF występuje przed ABC, ale prawdą jest, że wartości DEF są następujące po sobie w kolejności, więc nie powinieneś widzieć DEF, DEF, ABC, ABC, DEF jak wartości w kolumnie cat) – user1582928

+2

@ user1582928 Jak za http://msdn.microsoft.com/en-us/library/ms173825.aspx " Określa kolejność, w jakiej funkcja DENSE_RANK jest stosowana do wierszy w partycji". I zawsze możesz dodać ORDER BY na końcu SELECT. – prashanth

+0

@ user1582928, jeśli chcesz, możesz określić funkcję zmiany kolejności, na przykład: zamówienie przez dekodowanie ("DEF", 1, "ABC", 2,3) –

31

Oto Rozwiązanie alternatywne.

Nie musisz martwić się o zamawianie Cat. Korzystając z poniższego SQL, uzyskasz niepowtarzalne wartości dla kombinacji Date & Cat.

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