ROW_NUMBER, RANK, DENSE_RANK
กำหนดหมายเลขและอันดับแถวภายในพาร์ทิชัน และเลือกฟังก์ชันจัดอันดับที่เหมาะสมเมื่อมีอันดับเสมอกัน
ROW_NUMBER, RANK, DENSE_RANK เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
ฟังก์ชันจัดลำดับหมายเลขสามชนิด
ฟังก์ชันหน้าต่างสามชนิดที่ใช้กำหนดหมายเลขให้แถวภายในกลุ่มย่อย:
ROW_NUMBER()— 1, 2, 3, 4 (ไม่ซ้ำกันเสมอ)RANK()— 1, 2, 2, 4 (ค่าที่เสมอกันใช้หมายเลขร่วมกัน แล้วข้ามหมายเลขถัดไป)DENSE_RANK()— 1, 2, 2, 3 (ค่าที่เสมอกันใช้หมายเลขร่วมกัน โดยไม่ข้ามหมายเลข)
ROW_NUMBER
กำหนดหมายเลข 1, 2, 3 ภายในแต่ละกลุ่มย่อย ค่าที่เสมอกันจะถูกจัดลำดับแบบไม่แน่นอน ให้ระบุเกณฑ์ตัดสินกรณีเสมอกันใน ORDER BY เพื่อให้ผลลัพธ์แน่นอน:
SELECT id, user_id, total,
ROW_NUMBER() OVER (
PARTITION BY user_id ORDER BY total DESC, id
) AS rn
FROM orders;N อันดับแรกต่อกลุ่ม
การใช้งาน ROW_NUMBER แบบคลาสสิก:
WITH ranked AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY user_id ORDER BY total DESC
) AS rn
FROM orders
)
SELECT * FROM ranked WHERE rn <= 3;
-- Each user's top 3 orders.RANK
แถวที่มีค่า ORDER BY เดียวกันจะได้ลำดับเดียวกัน ค่าที่แตกต่างกันถัดไปจะข้ามช่วงหมายเลข:
-- totals: 100, 90, 90, 70
-- RANK: 1, 2, 2, 4 (skipped 3)
SELECT id, total,
RANK() OVER (ORDER BY total DESC) AS rk
FROM orders;DENSE_RANK
เหมือนกับ RANK แต่ไม่มีช่วงหมายเลขที่ข้ามไป:
-- totals: 100, 90, 90, 70
-- DENSE: 1, 2, 2, 3
SELECT id, total,
DENSE_RANK() OVER (ORDER BY total DESC) AS dr
FROM orders;การเลือกใช้ระหว่างฟังก์ชันเหล่านี้
- ต้องการหมายเลขที่ไม่ซ้ำกัน เช่น สำหรับการแบ่งหน้าใช่หรือไม่
ROW_NUMBER - ต้องการจัดลำดับแบบดั้งเดิมที่ค่าที่เสมอกันจะข้ามหมายเลขถัดไปใช่หรือไม่
RANK - ต้องการจัดลำดับที่ค่าที่เสมอกันใช้หมายเลขร่วมกัน และหมายเลขถัดไปเป็นลำดับถัดไปใช่หรือไม่
DENSE_RANK
NTILE: กลุ่มแบ่งตามควอนไทล์ N กลุ่ม
NTILE(n) แบ่งแถวออกเป็นกลุ่มจำนวน n กลุ่มที่มีขนาดใกล้เคียงกัน:
SELECT id, total,
NTILE(4) OVER (ORDER BY total) AS quartile
FROM orders;
-- 1 = bottom 25%, 4 = top 25%การลบแถวซ้ำ
ใช้ ROW_NUMBER ร่วมกับ DELETE เพื่อเก็บไว้หนึ่งแถวต่อกลุ่มข้อมูลซ้ำ:
WITH dups AS (
SELECT id,
ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) AS rn
FROM users
)
DELETE FROM users WHERE id IN (SELECT id FROM dups WHERE rn > 1);การแบ่งหน้าต่อกลุ่ม
หน้าที่ 2 ของ "คำสั่งซื้อของผู้ใช้แต่ละคน หน้าละ 5 รายการ":
WITH r AS (
SELECT id, user_id,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC) AS rn
FROM orders
)
SELECT * FROM r WHERE rn BETWEEN 6 AND 10;PERCENT_RANK และ CUME_DIST
ตำแหน่งสัมพัทธ์ภายในกลุ่มย่อย:
SELECT id, total,
PERCENT_RANK() OVER (ORDER BY total) AS pct_rank,
CUME_DIST() OVER (ORDER BY total) AS cume_dist
FROM orders;ประสิทธิภาพ
ฟังก์ชันจัดลำดับหมายเลขต้องใช้ข้อมูลที่จัดเรียงภายในแต่ละกลุ่มย่อยแล้ว ดัชนีบน (partition_col, order_col) อาจช่วยหลีกเลี่ยงขั้นตอนการจัดเรียง
สรุป
ฟังก์ชันจัดลำดับหมายเลขสามชนิดครอบคลุมความต้องการส่วนใหญ่
- ROW_NUMBER สำหรับความไม่ซ้ำกัน
- RANK / DENSE_RANK สำหรับการจัดลำดับที่มีค่าเสมอกัน
- NTILE สำหรับแบ่งเป็นกลุ่มควอนไทล์
ตรวจสอบความเข้าใจ
เมื่อมียอดรวม 100, 90, 90, 70 DENSE_RANK จะให้ผลลัพธ์ใด
เรียนรู้ SQL ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 46
- บทเรียน
- 183
คำถามที่พบบ่อย
บทเรียน “ROW_NUMBER, RANK, DENSE_RANK” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ROW_NUMBER, RANK, DENSE_RANK” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ROW_NUMBER, RANK, DENSE_RANK”
กำหนดหมายเลขและอันดับแถวภายในพาร์ทิชัน และเลือกฟังก์ชันจัดอันดับที่เหมาะสมเมื่อมีอันดับเสมอกัน คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “ROW_NUMBER, RANK, DENSE_RANK” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- OVER, PARTITION BY, ORDER BY
- ROW_NUMBER, RANK, DENSE_RANK
- LAG, LEAD และรูปแบบอนุกรมเวลา
- ผลรวมสะสมและค่าเฉลี่ยเคลื่อนที่