Kullanımı count(*) over(partition by...)
, istenmeyen tekrarları bulmak için basit ve etkili bir yol sağlarken, etkilenen tüm satırları ve istenen tüm sütunları da listeler:
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
En son RDBMS sürümleri count(*) over(partition by...)
MySQL V 8.0'ı desteklerken , aşağıda görüldüğü gibi (MySQL 8.0'da) "pencere işlevleri" tanıtıldı
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')
;
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 | isim | şehir | adet
-----: | : --- | : ----- | -:
90145 | Fred | Paris | 3
90132 | Fred | Paris | 3
90133 | Fred | Paris | 3
904834 | jim | Londra | 2
904835 | jim | Londra | 2
db <> burada fiddle
Pencere işlevleri. MySQL artık bir sorgudaki her satır için o satırla ilgili satırları kullanarak bir hesaplama yapan pencere işlevlerini destekliyor. Bunlar, RANK (), LAG () ve NTILE () gibi işlevleri içerir. Ek olarak, mevcut birkaç toplama işlevi artık pencere işlevleri olarak kullanılabilir; örneğin, TOPLA () ve AVG (). Daha fazla bilgi için bkz. Bölüm 12.21, "Pencere İşlevleri" .
name
veyacity
içeriyorsanull
, dış sorguda raporlanamayacaklarını, ancak iç sorguda eşleştirileceklerini unutmayın.