SQL Academy · บทเรียน

ROW_NUMBER, RANK, DENSE_RANK

กำหนดหมายเลขและอันดับแถวภายในพาร์ทิชัน และเลือกฟังก์ชันจัดอันดับที่เหมาะสมเมื่อมีอันดับเสมอกัน

บทเรียน 2 จาก 413 ขั้นตอน

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. OVER, PARTITION BY, ORDER BY
  2. ROW_NUMBER, RANK, DENSE_RANK
  3. LAG, LEAD และรูปแบบอนุกรมเวลา
  4. ผลรวมสะสมและค่าเฉลี่ยเคลื่อนที่
← กลับไปที่ SQL Academy