2012-02-07 25 views
5

Tôi đang cố gắng lấy số hàng cho mỗi chuỗi.Chọn số lượng các bản ghi tuần tự

Bảng ban đầu có thể trông như thế này:

+----+-------------+ 
| id | value  | 
+----+-------------+ 
| 1 | a   | 
| 2 | b   | 
| 3 | b   | 
| 4 | c   | 
| 5 | a   | 
| 6 | a   | 
| 7 | a   | 
| 8 | a   | 
| 9 | c   | 
| 10| c   | 
+----+-------------+ 

Truy vấn nên trả lại số mục cho mỗi chuỗi các giá trị:

+----+-------------+ 
| value | count | 
+----+-------------+ 
| a | 1  | 
| b | 2  | 
| c | 1  | 
| a | 4  | 
| c | 2  | 
+-------+----------+ 

Cho đến nay tôi đã không thể đến với một giải pháp, ít nhất là không đủ nhanh cho các bảng lớn. Lý tưởng nhất là sẽ có một tuyên bố "nhóm theo" mà không gây rối trật tự của hồ sơ.

+2

Đây được gọi là mã hóa độ dài chạy. –

+0

Bản sao của http://stackoverflow.com/questions/9172006/how-to-combine-near-same-item-by-sql – flesk

Trả lời

2
SELECT value, count(*) FROM (
    SELECT value, 
    (CASE WHEN @v != value THEN @i:[email protected]+1 ELSE @i END) gid, 
    @v := value FROM myTable, (SELECT @v:='', @i := 0) vars 
) tbl 
GROUP BY gid 
+0

Tôi nghĩ rằng đây là VERY CLOSE ... Chỉ có điều. Trên thay đổi từ mỗi bản ghi SAU lần đầu tiên, @i sẽ là số bắt đầu chu kỳ tiếp theo. Tôi sẽ thay đổi ELSE của bạn thành ELSE @i: = 1 ... để cho biết nó đang được đặt lại về 1 khi bắt đầu ID mới chỉ cần nhập. – DRapp

+0

@DRapp: Bạn đã thử chưa? Tôi nghĩ rằng nó hoạt động như OP muốn như là, và rằng đề nghị của bạn sẽ phá vỡ nó. Bạn cần một bộ đếm không ngừng tăng hoặc bạn sẽ nhóm các giá trị bằng nhau được phân tách bằng các nhóm giá trị khác nhau. – flesk

+0

bạn đã chính xác ... đã bỏ lỡ nó và COUNT của bạn là bộ đếm thực tế trong đó giá trị "i" của bạn là lực ngắt giữa mỗi thay đổi theo chu kỳ giữa các giá trị ... đã giải thích sai biến "i" của bạn – DRapp

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