Użycie count(*) over(partition by...)
zapewnia prosty i skuteczny sposób znajdowania niechcianych powtórzeń, a także wyświetla listę wszystkich dotkniętych wierszy i wszystkich żądanych kolumn:
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
Podczas gdy najnowsze wersje RDBMS obsługują count(*) over(partition by...)
MySQL V 8.0 wprowadzono „funkcje okna”, jak widać poniżej (w 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 | nazwa | miasto | szt
-----: | : --- | : ----- | -:
90145 | Fred | Paryż | 3
90132 | Fred | Paryż | 3
90133 | Fred | Paryż | 3
904834 | jim | Londyn | 2
904835 | jim | Londyn | 2
db <> skrzypce tutaj
Funkcje okna. MySQL obsługuje teraz funkcje okna, które dla każdego wiersza zapytania wykonują obliczenia przy użyciu wierszy powiązanych z tym wierszem. Należą do nich funkcje takie jak RANK (), LAG () i NTILE (). Ponadto kilka istniejących funkcji agregujących może być teraz używanych jako funkcje okna; na przykład SUMA () i ŚREDNIA (). Aby uzyskać więcej informacji, zobacz Sekcja 12.21, „Funkcje okna” .
name
lubcity
zawieraćnull
, wtedy nie należy zgłaszać w zapytaniu zewnętrznym, ale będą dopasowane do zapytania wewnętrznej.