Використання count(*) over(partition by...)
надає прості та ефективні засоби для виявлення небажаного повторення, а також перераховує всі зазначені рядки та всі потрібні стовпці:
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
Хоча найновіші версії СУБД підтримують count(*) over(partition by...)
MySQL V 8.0, представлені "віконні функції", як показано нижче (у 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
ідентифікатор | назва | місто | кількість
-----: | : --- | : ----- | -:
90145 | Фред | Париж | 3
90132 | Фред | Париж | 3
90133 | Фред | Париж | 3
904834 | джим | Лондон | 2
904835 | джим | Лондон | 2
db <> скрипка тут
Функції вікна. MySQL тепер підтримує віконні функції, які для кожного рядка із запиту виконують обчислення, використовуючи рядки, пов'язані з цим рядком. До них належать такі функції, як RANK (), LAG () та NTILE (). Крім того, декілька існуючих функцій сукупності зараз можуть використовуватися як функції вікон; наприклад, SUM () і AVG (). Для отримання додаткової інформації див. Розділ 12.21, “Віконні функції” .
name
абоcity
містятьnull
, то вони не будуть повідомлятися у зовнішньому запиті, але будуть відповідати у внутрішньому запиті.