2012-03-20 31 views
6

Ý tưởng là nói rằng bạn có bảng sau đây.SQL GROUP BY: khoảng thời gian liên tục?

------------- 
| oID | Area| 
------------- 
| 1 | 5  | 
| 2 | 2  | 
| 3 | 3  | 
| 5 | 3  | 
| 6 | 4  | 
| 7 | 5  | 
------------- 

Nếu nhóm bằng cách liên tục có thể này truy vấn giả

SELECT SUM(Area) FROM sample_table GROUP BY CONTINUITY(oID) 

sẽ trở

------------- 
| SUM(Area) | 
------------- 
| 10  | 
| 12  | 
------------- 

Trong trường hợp phá vỡ tính liên tục phát sinh tại OID hay đúng hơn là thiếu đó một mục đại diện cho OID 4.

Chức năng này có tồn tại trong các hàm chuẩn của Sql không?

Trả lời

5

Không có chức năng như vậy trong "chức năng chuẩn của SQL", nhưng có thể lấy tập kết quả mong muốn bằng cách sử dụng một số thủ thuật.

Với truy vấn con được minh họa bên dưới, chúng tôi tạo một trường ảo mà bạn có thể sử dụng để truy cập GROUP BY trong truy vấn bên ngoài. Giá trị của trường ảo này được tăng lên mỗi lần khi có khoảng trống trong chuỗi oID. Bằng cách này, chúng ta tạo ra một định danh cho mỗi người trong số những "hòn đảo dữ liệu":

SELECT SUM(Area), COUNT(*) AS Count_Rows 
FROM (
     /* @group_enumerator is incremented each time there is a gap in oIDs continuity */ 
     SELECT @group_enumerator := @group_enumerator + (@prev_oID != oID - 1) AS group_enumerator, 
       @prev_oID := oID AS prev_oID, 
       sample_table.* 
     FROM (
       SELECT @group_enumerator := 0, 
         @prev_oID := -1 
       ) vars, 
       sample_table 
     /* correct order is very important */ 
     ORDER BY 
       oID 
     ) q 
GROUP BY 
     group_enumerator 

Kiểm tra bảng và dữ liệu thế hệ:

CREATE TABLE sample_table (oID INT auto_increment, Area INT, PRIMARY KEY(oID)); 
INSERT INTO sample_table (oID, Area) VALUES (1,5), (2,2), (3,3), (5,3), (6,4), (7,5); 

tôi cần phải cảm ơn Quassnoi để chỉ ra this trick in my related question ;-)

CẬP NHẬT: thêm bảng thử nghiệm và dữ liệu và tên cột trùng lặp cố định trong truy vấn ví dụ.

0

Đây là bài đăng trên blog cung cấp giải thích và ví dụ rất kỹ lưỡng liên quan đến grouping by contiguous data. Nếu bạn có bất kỳ vấn đề nào hiểu nó hoặc triển khai nó, tôi có thể cố gắng cung cấp một sự triển khai cho vấn đề của bạn.

+0

điều này cũng có thể thực hiện mà không cần sử dụng các bảng tạm thời. – Kaii