Использование 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
id | имя | город | кол-во
-----: | : --- | : ----- | -:
90145 | Фред | Париж | 3
90132 | Фред | Париж | 3
90133 | Фред | Париж | 3
904834 | Джим | Лондон | 2
904835 | Джим | Лондон | 2
db <> скрипка здесь
Оконные функции. MySQL теперь поддерживает оконные функции, которые для каждой строки запроса выполняют вычисление с использованием строк, связанных с этой строкой. К ним относятся такие функции, как RANK (), LAG () и NTILE (). Кроме того, некоторые существующие агрегатные функции теперь могут использоваться как оконные; например, SUM () и AVG (). Для получения дополнительной информации см. Раздел 12.21, «Оконные функции» .
name
илиcity
содержатnull
, то они не будут отражены во внешнем запросе, но будут сопоставлены во внутреннем запросе.