L'utilisation count(*) over(partition by...)
fournit un moyen simple et efficace de localiser les répétitions indésirables, tout en répertoriant toutes les lignes affectées et toutes les colonnes souhaitées:
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
Alors que les versions les plus récentes du SGBDR prennent en charge count(*) over(partition by...)
MySQL V 8.0, des «fonctions de fenêtre» ont été introduites, comme indiqué ci-dessous (dans 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 | nom | ville | qté
-----: | : --- | : ----- | -:
90145 | Fred | Paris | 3
90132 | Fred | Paris | 3
90133 | Fred | Paris | 3
904834 | jim | Londres | 2
904835 | jim | Londres | 2
db <> violon ici
Fonctions de la fenêtre. MySQL prend désormais en charge les fonctions de fenêtre qui, pour chaque ligne d'une requête, effectuent un calcul en utilisant des lignes liées à cette ligne. Il s'agit notamment de fonctions telles que RANK (), LAG () et NTILE (). De plus, plusieurs fonctions d'agrégation existantes peuvent désormais être utilisées comme fonctions de fenêtre; par exemple, SUM () et AVG (). Pour plus d'informations, reportez-vous à la Section 12.21, «Fonctions de la fenêtre» .
name
ou l' autrecity
contient ou contientnull
, ils ne seront pas signalés dans la requête externe, mais seront mis en correspondance dans la requête interne.