cùng một logic như rexem, nhưng hoạt động trên bất kỳ RDBMS cửa sổ có khả năng (sẽ không hoạt động trên MySQL chưa):
CREATE TABLE tbl
(
id INT,
val VARCHAR(1)
);
INSERT INTO tbl(id,val)
VALUES(1,'a'),(2,'a'),(3,'a'),(4,'a'),(5,'b'),(6,'b'),(7,'a'),(8,'a'),(9,'a');
nguồn:
1 a
2 a
3 a
4 a
5 b
6 b
7 a
8 a
9 a
Truy vấn kiểu cửa sổ: (hoạt động trên cửa sổ-c rdbms apable):
WITH grouped_result AS
(
SELECT x.id, x.val,
COUNT(CASE WHEN y.val IS NULL OR y.val <> x.val THEN 1 END)
OVER (ORDER BY x.id) AS grp
FROM tbl x LEFT JOIN tbl y ON y.id + 1 = x.id
)
SELECT MIN(id) mi, val, COUNT(*)
FROM grouped_result
GROUP BY val, grp
ORDER BY mi
Output:
1 a 4
5 b 2
7 a 3
BTW, đây là kết quả của sự grouped_result mà không GROUP BY:
1 a 1
2 a 1
3 a 1
4 a 1
5 b 2
6 b 2
7 a 3
8 a 3
9 a 3
Feels viết lại tốt mysqlism-truy vấn để ANSI -conforming một :-) Bây giờ, trong khi mysql không có capabality windowing được nêu ra, rexem của câu trả lời là tốt nhất. Rexem, đó là một kỹ thuật mysql tốt (JOIN (SELECT @rownum: = 0)) ở đó, và afaik MSSQL và PostgreSQL không hỗ trợ ngầm khai báo biến, kudo! :-)
chuyển +1 sang bên phải, sau đó đặt -1. vì vậy nó sẽ không mang lại hiệu quả quét bảng. mysql không thể có chỉ mục trên biểu thức –
Đó là nó! Cảm ơn nhiều! – Kuyenda
Nếu bạn sử dụng 'CASE WHEN xt.id IS NULL HOẶC xt.val! = X.val' thì SQL sẽ không ngắt khi val là cố ý NULL, nhưng nó vẫn nắm bắt được phép so sánh offset đầu tiên. – Kuyenda