Việc sử dụng count(*) over(partition by...)
cung cấp một phương tiện đơn giản và hiệu quả để xác định vị trí lặp lại không mong muốn, đồng thời liệt kê tất cả các hàng bị ảnh hưởng và tất cả các cột mong muốn:
SELECT
t.*
FROM (
SELECT
s.*
, COUNT(*) OVER (PARTITION BY s.name, s.city) AS qty
FROM stuff s
) t
WHERE t.qty > 1
ORDER BY t.name, t.city
Trong khi hầu hết các phiên bản RDBMS gần đây hỗ trợ count(*) over(partition by...)
MySQL V 8.0 đã giới thiệu "các hàm cửa sổ", như được thấy bên dưới (trong MySQL 8.0)
CREATE TABLE stuff(
id INTEGER NOT NULL
,name VARCHAR(60) NOT NULL
,city VARCHAR(60) NOT NULL
);
INSERT INTO stuff(id,name,city) VALUES
(904834,'jim','London')
, (904835,'jim','London')
, (90145,'Fred','Paris')
, (90132,'Fred','Paris')
, (90133,'Fred','Paris')
, (923457,'Barney','New York') # not expected in result
;
SELECT
t.*
FROM (
SELECT
s.*
, COUNT(*) OVER (PARTITION BY s.name, s.city) AS qty
FROM stuff s
) t
WHERE t.qty > 1
ORDER BY t.name, t.city
id | tên | thành phố | qty
-----: | : --- | : ----- | -:
90145 | Fred | Paris | 3
90132 | Fred | Paris | 3
90133 | Fred | Paris | 3
904834 | jim | Luân Đôn | 2
904835 | jim | Luân Đôn | 2
db <> fiddle here
Các chức năng của cửa sổ. MySQL hiện hỗ trợ các hàm cửa sổ, đối với mỗi hàng từ một truy vấn, thực hiện phép tính bằng cách sử dụng các hàng liên quan đến hàng đó. Chúng bao gồm các hàm như RANK (), LAG () và NTILE (). Ngoài ra, một số hàm tổng hợp hiện có có thể được sử dụng như các hàm cửa sổ; ví dụ, SUM () và AVG (). Để biết thêm thông tin, hãy xem Phần 12.21, “Chức năng cửa sổ” .
name
hoặccity
chứanull
, thì chúng sẽ không được báo cáo trong truy vấn bên ngoài, nhưng sẽ được so khớp trong truy vấn bên trong.