O uso count(*) over(partition by...)
fornece um meio simples e eficiente de localizar repetições indesejadas, ao mesmo tempo que lista todas as linhas afetadas e todas as colunas desejadas:
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
Enquanto as versões mais recentes de RDBMS suportam count(*) over(partition by...)
MySQL V 8.0 introduziu "funções de janela", como visto abaixo (no 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 | nome | cidade | qty
-----: | : --- | : ----- | -:
90145 | Fred | Paris | 3
90132 | Fred | Paris | 3
90133 | Fred | Paris | 3
904834 | Jim | Londres | 2
904835 | Jim | Londres | 2
db <> fiddle aqui
Funções de janela. O MySQL agora suporta funções de janela que, para cada linha de uma consulta, realizam um cálculo usando linhas relacionadas a essa linha. Isso inclui funções como RANK (), LAG () e NTILE (). Além disso, várias funções de agregação existentes agora podem ser usadas como funções de janela; por exemplo, SUM () e AVG (). Para obter mais informações, consulte a Seção 12.21, “Funções da janela” .
name
oucity
contiveremnull
, eles não serão relatados na consulta externa, mas serão correspondidos na consulta interna.