L'utilizzo count(*) over(partition by...)
fornisce un mezzo semplice ed efficiente per individuare ripetizioni indesiderate, mentre elenca anche tutte le righe interessate e tutte le colonne desiderate:
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
Sebbene le versioni più recenti di RDBMS supportino count(*) over(partition by...)
MySQL V 8.0, sono state introdotte "funzioni finestra", come mostrato di seguito (in 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 | città | qty
-----: | : --- | : ----- | -:
90145 | Fred | Parigi | 3
90132 | Fred | Parigi | 3
90133 | Fred | Parigi | 3
904834 | jim | Londra | 2
904835 | jim | Londra | 2
db <> fiddle qui
Funzioni della finestra. MySQL ora supporta le funzioni della finestra che, per ogni riga di una query, eseguono un calcolo utilizzando le righe relative a quella riga. Questi includono funzioni come RANK (), LAG () e NTILE (). Inoltre, diverse funzioni aggregate esistenti ora possono essere utilizzate come funzioni finestra; ad esempio, SUM () e AVG (). Per ulteriori informazioni, vedere la Sezione 12.21, "Funzioni della finestra" .
name
o duecity
contengononull
, non verranno riportati nella query esterna, ma verranno trovati nella query interna.