การใช้count(*) over(partition by...)
เป็นวิธีที่ง่ายและมีประสิทธิภาพในการค้นหาการทำซ้ำที่ไม่ต้องการในขณะที่ยังแสดงรายการแถวที่ได้รับผลกระทบและคอลัมน์ที่ต้องการทั้งหมด:
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
ในขณะที่เวอร์ชัน RDBMS ล่าสุดรองรับcount(*) over(partition by...)
MySQL V 8.0แนะนำ "ฟังก์ชันหน้าต่าง" ดังที่แสดงด้านล่าง (ใน 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')
;
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 | ชื่อ | เมือง | จำนวน
-----: | : --- | : ----- | -:
90145 | เฟรด | ปารีส | 3
90132 | เฟรด | ปารีส | 3
90133 | เฟรด | ปารีส | 3
904834 | จิม | ลอนดอน | 2
904835 | จิม | ลอนดอน | 2
db <> ซอที่นี่
ฟังก์ชันหน้าต่าง ขณะนี้ MySQL สนับสนุนฟังก์ชันหน้าต่างที่สำหรับแต่ละแถวจากคิวรีทำการคำนวณโดยใช้แถวที่เกี่ยวข้องกับแถวนั้น ซึ่งรวมถึงฟังก์ชันต่างๆเช่น RANK (), LAG () และ NTILE () นอกจากนี้ฟังก์ชันการรวมที่มีอยู่หลายฟังก์ชันสามารถใช้เป็นฟังก์ชันหน้าต่างได้ ตัวอย่างเช่น SUM () และ AVG () สำหรับข้อมูลเพิ่มเติมโปรดดูมาตรา 12.21“ฟังก์ชั่นหน้าต่าง”
name
หรือcity
มีnull
ก็จะไม่สามารถรายงานในแบบสอบถามภายนอกได้ แต่จะถูกจับคู่ในคำค้นหาภายใน