Die Verwendung count(*) over(partition by...)
bietet eine einfache und effiziente Möglichkeit, unerwünschte Wiederholungen zu lokalisieren und alle betroffenen Zeilen und gewünschten Spalten aufzulisten:
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
Während die neuesten RDBMS-Versionen count(*) over(partition by...)
MySQL V 8.0 unterstützen , wurden "Fensterfunktionen" eingeführt (siehe unten) (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 | Name | Stadt | Menge
-----: | : --- | : ----- | -:
90145 | Fred | Paris | 3
90132 | Fred | Paris | 3
90133 | Fred | Paris | 3
904834 | jim | London | 2
904835 | jim | London | 2
db <> hier fummeln
Fensterfunktionen. MySQL unterstützt jetzt Fensterfunktionen, die für jede Zeile aus einer Abfrage eine Berechnung mit Zeilen durchführen, die sich auf diese Zeile beziehen. Dazu gehören Funktionen wie RANK (), LAG () und NTILE (). Darüber hinaus können jetzt mehrere vorhandene Aggregatfunktionen als Fensterfunktionen verwendet werden. Zum Beispiel SUM () und AVG (). Weitere Informationen finden Sie in Abschnitt 12.21, „Fensterfunktionen“ .
name
odercity
enthaltennull
, sie in der äußeren Abfrage nicht gemeldet werden, in der inneren Abfrage jedoch übereinstimmen.