2013-01-03 8 views
5

Chcę wybrać 2 kolumny z tabeli i przypisać wartość int do każdej wartości. Jednak chcę, aby identyfikator pierwszej kolumny był taki sam dla wszystkich wartości, które są takie same.Przypisywanie numeru wiersza w programie SQL Server, ale zgrupowane na wartości

Dla drugiej kolumny chcę, aby każda wartość również była ponumerowana, ale podzielona przez pierwszą kolumnę. Wymyśliłem ten artykuł, ale nie mogę wykonać pierwszej części.

Oto scenariusz testowy, którego używam.

DECLARE @TestTable as Table (Column1 char(1), Column2 char(1)) 

INSERT INTO @TestTable SELECT 'A','A' 
INSERT INTO @TestTable SELECT 'A','B' 
INSERT INTO @TestTable SELECT 'A','C' 
INSERT INTO @TestTable SELECT 'B','D' 
INSERT INTO @TestTable SELECT 'B','E' 
INSERT INTO @TestTable SELECT 'B','F' 
INSERT INTO @TestTable SELECT 'B','G' 
INSERT INTO @TestTable SELECT 'B','H' 
INSERT INTO @TestTable SELECT 'C','A' 
INSERT INTO @TestTable SELECT 'C','B' 
INSERT INTO @TestTable SELECT 'C','C' 


SELECT 
    Row_Number() OVER (Partition BY Column1 ORDER BY Column1) as Column1_ID, 
    Column1, 
    Row_Number() OVER (Partition BY Column1 ORDER BY Column1, Column2) as Column2_ID, 
    Column2 
FROM @TestTable 

Kiedy uruchomić ten, wartości w Column2_ID są poprawne, ale chciałbym wartości dla Column1_ID się następująco.

Column1_ID Column1 Column2_ID Column2 
1    A  1   A 
1    A  2   B 
1    A  3   C 
2    B  1   D 
2    B  2   E 
2    B  3   F 
2    B  4   G 
2    B  5   H 
3    C  1   A 
3    C  2   B 
3    C  3   C 

Odpowiedz

10

Wystarczy użyć innej funkcji rankingową,

dense_rank() OVER (ORDER BY Column1) as Column1_ID 

http://msdn.microsoft.com/en-us/library/ms173825.aspx

SQL Fiddle: http://www.sqlfiddle.com/#!6/d41d8/1832

+0

+1 wyjątkiem, że nie chcesz się 'partition', inaczej wszystkie wychodzą z wartością '1': http://www.sqlfiddle.com/#!6/d41d8/1829 – mellamokb

+0

Tak, po prostu zdałem sobie sprawę, że muszę to usunąć: http://www.sqlfiddle.com/#! 6/d41d8/1832 – Andrew

+0

Próbowałem tego rozwiązania (jak pierwotnie napisałeś) i nie działało. Nie wiedziałem, że partycja jest opcjonalna. Dzięki. Dokładnie to, czego potrzebuję. –

Powiązane problemy