2015-04-19 15 views
7

Tôi có một bảng được gọi là DATA trên Microsoft SQL Server 2008 R2 với ba trường số nguyên không nullable: ID, Trình tự và Giá trị. Giá trị chuỗi với cùng một ID sẽ liên tiếp, nhưng có thể bắt đầu với bất kỳ giá trị nào. Tôi cần truy vấn sẽ trả về một số hàng liên tiếp có cùng ID và Giá trị.SQL Server GROUP BY COUNT Hàng liên tiếp Chỉ

Ví dụ, giả sử tôi có các dữ liệu sau:

ID Sequence Value 
-- -------- ----- 
1   1  1 
5   1 100 
5   2 200 
5   3 200 
5   4 100 
10  10  10 

Tôi muốn các kết quả sau:

ID Start Value Count 
-- ----- ----- ----- 
1  1  1  1 
5  1 100  1 
5  2 200  2 
5  4 100  1 
10 10  10  1 

tôi đã cố gắng

SELECT ID, MIN([Sequence]) AS Start, Value, COUNT(*) AS [Count] 
FROM DATA 
GROUP BY ID, Value 
ORDER BY ID, Start 

nhưng điều đó mang lại cho

ID Start Value Count 
-- ----- ----- ----- 
1  1  1  1 
5  1 100  2 
5  2 200  2 
10 10  10  1 

nhóm tất cả các hàng có cùng giá trị, không chỉ các hàng liên tiếp.

Bất kỳ ý tưởng nào? Từ những gì tôi đã nhìn thấy, tôi tin rằng tôi phải rời khỏi bàn với chính nó trên các hàng liên tiếp bằng cách sử dụng ROW_NUMBER(), nhưng tôi không chắc chắn chính xác làm thế nào để có được đếm từ đó.

Xin cảm ơn trước.

+2

Tra cứu [khoảng trống và đảo] (http://stackoverflow.com/questions/tagged/gaps-and-islands) –

Trả lời

9

Bạn có thể sử dụng Sequence - ROW_NUMBER() OVER (ORDER BY ID, Val, Sequence) AS g để tạo ra một nhóm:

SELECT 
    ID, 
    MIN(Sequence) AS Sequence, 
    Val, 
    COUNT(*) AS cnt 
FROM 
(
    SELECT 
    ID, 
    Sequence, 
    Sequence - ROW_NUMBER() OVER (ORDER BY ID, Val, Sequence) AS g, 
    Val 
    FROM 
    yourtable 
) AS s 
GROUP BY 
    ID, Val, g 

Hãy xem một fiddle here.