มี 4 วิธีที่คุณสามารถใช้ได้:
- แตกต่าง
- GROUP BY
- แบบสอบถามย่อย
- นิพจน์ตารางทั่วไป (CTE) กับ ROW_NUMBER ()
พิจารณาตัวอย่างต่อไปนี้TABLE
พร้อมข้อมูลการทดสอบ:
CREATE TEMPORARY TABLE dupes(word text, num int, id int);
INSERT INTO dupes(word, num, id)
VALUES ('aaa', 100, 1)
,('bbb', 200, 2)
,('ccc', 300, 3)
,('bbb', 400, 4)
,('bbb', 200, 5)
,('ccc', 300, 6)
,('ddd', 400, 7)
,('bbb', 400, 8)
,('aaa', 100, 9)
,('ccc', 300, 10);
ตัวเลือกที่ 1: เลือก DISTINCT
นี่เป็นวิธีที่ง่ายและตรงไปตรงมาที่สุด แต่ยังเป็นวิธีที่ จำกัด ที่สุด:
SELECT DISTINCT word, num
FROM dupes
ORDER BY word, num;
ตัวเลือกที่ 2: GROUP BY
การจัดกลุ่มช่วยให้คุณสามารถเพิ่มข้อมูลรวมเช่นmin(id)
, max(id)
, count(*)
ฯลฯ :
SELECT word, num, min(id), max(id), count(*)
FROM dupes
GROUP BY word, num
ORDER BY word, num;
ตัวเลือกที่ 3: แบบสอบถามย่อย
การใช้เคียวรีย่อยคุณสามารถระบุแถวที่ซ้ำกันเพื่อละเว้นก่อนจากนั้นกรองออกในแบบสอบถามภายนอกด้วยWHERE NOT IN (subquery)
โครงสร้าง:
SELECT distinct d2.id
FROM dupes d1
INNER JOIN dupes d2 ON d2.word=d1.word AND d2.num=d1.num
WHERE d2.id > d1.id
SELECT *
FROM dupes
WHERE id NOT IN (
SELECT d2.id
FROM dupes d1
INNER JOIN dupes d2 ON d2.word=d1.word AND d2.num=d1.num
WHERE d2.id > d1.id
)
ORDER BY word, num;
ตัวเลือกที่ 4: นิพจน์ตารางทั่วไปกับ ROW_NUMBER ()
ใน Common Table Expression (CTE) เลือก ROW_NUMBER () แบ่งพาร์ติชันตามคอลัมน์กลุ่มและเรียงลำดับตามลำดับที่ต้องการ จากนั้นเลือกเฉพาะระเบียนที่มีROW_NUMBER() = 1
:
WITH CTE AS (
SELECT *
,row_number() OVER(PARTITION BY word, num ORDER BY id) AS row_num
FROM dupes
)
SELECT word, num, id
FROM cte
WHERE row_num = 1
ORDER BY word, num;