2013-01-03 41 views
5

Tôi muốn chọn 2 cột từ một bảng và gán giá trị int cho mỗi giá trị. Tuy nhiên, tôi muốn ID cột thứ nhất giống nhau cho tất cả các giá trị giống nhau.Chỉ định một số hàng trong SQL Server, nhưng được nhóm lại trên một giá trị

Đối với cột thứ hai, tôi muốn mỗi giá trị được đánh số là tốt, nhưng được phân đoạn theo cột đầu tiên. Tôi đã tìm ra phần này, nhưng tôi không thể có được phần đầu tiên để làm việc.

Đây là kịch bản thử nghiệm tôi đang sử dụng.

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 

Khi tôi chạy điều này, các giá trị trong Column2_ID là chính xác, nhưng tôi muốn các giá trị cho Column1_ID như sau.

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 

Trả lời

10

Bạn chỉ cần sử dụng một chức năng thứ hạng khác nhau,

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 Trừ bạn không muốn 'partition', nếu không tất cả chúng đều xuất hiện với giá trị '1': http://www.sqlfiddle.com/#!6/d41d8/1829 – mellamokb

+0

Yup, chỉ cần nhận ra rằng tôi cần nó xóa: http://www.sqlfiddle.com/#! 6/d41d8/1832 – Andrew

+0

Tôi đã thử giải pháp đó (như bạn đã đăng lúc đầu) và nó không hoạt động. Tôi không nhận ra Partition là tùy chọn. Cảm ơn. Điều này thực hiện chính xác những gì tôi cần. –

Các vấn đề liên quan