2012-09-20 31 views
32

Tôi có tập dữ liệu chứa các cột Date, CatQTY. Những gì tôi muốn làm là thêm một cột duy nhất chỉ tính các giá trị Cat duy nhất khi hàng đó đếm. Đây là những gì tôi muốn kết quả của tôi thiết lập để trông giống như:row_number() Nhóm theo?

enter image description here

Bằng cách sử dụng các truy vấn SQL dưới đây, tôi có thể nhận được hàng bằng cách sử dụng chức năng row_number().

Tuy nhiên, tôi không thể lấy cột duy nhất mà tôi đã mô tả ở trên. Khi tôi thêm nhóm theo mệnh đề OVER, nó sẽ không hoạt động. Có ai có bất kỳ ý tưởng như thế nào tôi có thể nhận được cột đếm độc đáo này để làm việc?

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

Trả lời

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

Cảm ơn, đây là một bước đi đúng hướng. Tuy nhiên, thực tế là bộ dữ liệu thực tế của tôi không được đặt hàng bởi con mèo. Bạn có biết làm thế nào nó sẽ làm việc trong ví dụ đó? (Hãy tưởng tượng rằng trong cột mèo của tôi, DEF xuất hiện trước ABC. Nhưng đúng là giá trị DEF liên tiếp trong thứ tự của tôi vì vậy bạn sẽ không thấy DEF, DEF, ABC, ABC, DEF như các giá trị trong cột mèo) – user1582928

+2

@ user1582928 theo http://msdn.microsoft.com/en-us/library/ms173825.aspx " Xác định thứ tự mà chức năng DENSE_RANK được áp dụng cho các hàng trong phân vùng". Và bạn luôn có thể thêm ORDER BY vào cuối SELECT. – prashanth

+0

@ user1582928, nếu bạn muốn bạn có thể chỉ định một chức năng để thay đổi thứ tự, ví dụ: order by decode ('DEF', 1, 'ABC', 2,3) –

31

Đây là giải pháp thay thế.

Bạn không cần phải lo lắng về thứ tự của Cat. Sử dụng SQL sau đây, bạn sẽ có thể nhận được các giá trị duy nhất cho kết hợp Date & Cat của bạn.

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