El uso count(*) over(partition by...)
proporciona un medio simple y eficiente para localizar repeticiones no deseadas, mientras que también enumera todas las filas afectadas y todas las columnas deseadas:
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
Mientras que las versiones más recientes de RDBMS son compatibles con count(*) over(partition by...)
MySQL V 8.0, se introdujeron "funciones de ventana", como se ve a continuación (en 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 | nombre | ciudad | cantidad
-----: | : --- | : ----- | -:
90145 | Fred | Paris | 3
90132 | Fred | Paris | 3
90133 | Fred | Paris | 3
904834 | jim | Londres | 2
904835 | jim | Londres | 2
db <> violín aquí
Funciones de ventana. MySQL ahora admite funciones de ventana que, para cada fila de una consulta, realizan un cálculo utilizando filas relacionadas con esa fila. Estas incluyen funciones como RANK (), LAG () y NTILE (). Además, varias funciones agregadas existentes ahora se pueden usar como funciones de ventana; por ejemplo, SUM () y AVG (). Para obtener más información, consulte la Sección 12.21, “Funciones de ventana” .
name
ocity
contienennull
, no se informarán en la consulta externa, pero se compararán en la consulta interna.