Menggunakan count(*) over(partition by...)
menyediakan cara yang sederhana dan efisien untuk menemukan pengulangan yang tidak diinginkan, sementara juga mencantumkan semua baris yang terpengaruh dan semua kolom yang diinginkan:
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
Sementara versi RDBMS terbaru mendukung count(*) over(partition by...)
MySQL V 8.0 memperkenalkan "fungsi jendela", seperti yang terlihat di bawah ini (di 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 | nama | kota | qty
-----: | : --- | : ----- | -:
90145 | Fred | Paris | 3
90132 | Fred | Paris | 3
90133 | Fred | Paris | 3
904834 | jim | London | 2
904835 | jim | London | 2
db <> biola di sini
Fungsi jendela. MySQL sekarang mendukung fungsi jendela yang, untuk setiap baris dari kueri, melakukan kalkulasi menggunakan baris yang terkait dengan baris tersebut. Ini termasuk fungsi seperti RANK (), LAG (), dan NTILE (). Selain itu, beberapa fungsi agregat yang ada sekarang dapat digunakan sebagai fungsi jendela; misalnya, SUM () dan AVG (). Untuk informasi lebih lanjut, lihat Bagian 12.21, "Fungsi Jendela" .
name
ataucity
berisinull
, maka mereka akan gagal dilaporkan di kueri luar, tetapi akan dicocokkan di kueri dalam.