การค้นหาระเบียนอันดับต้น ๆ
หาค่าที่สูงสุดและต่ำสุด
การค้นหาระเบียนอันดับต้น ๆ เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คำค้นหา N อันดับแรกคืออะไร
คำค้นหาN อันดับแรกใช้ตอบคำถาม เช่น "สินค้า 3 รายการที่แพงที่สุด" "คำสั่งซื้อ 10 รายการล่าสุด" หรือ "คะแนนต่ำสุด 5 รายการ"
จริง ๆ แล้วเป็นเพียงการเรียงลำดับร่วมกับการจำกัดจำนวนแถว แต่พบได้บ่อยมากจนสมควรมีชื่อเรียกเฉพาะ
-- Top 3 most expensive products
SELECT name, price
FROM products
ORDER BY price DESC
LIMIT 3;ระเบียน N อันดับท้าย
หากต้องการค่าที่น้อยที่สุด ให้กลับทิศทางการเรียงลำดับ เรียงแบบ ASC แล้วเลือก N แถวแรก เพื่อให้ได้แถวที่ราคาถูกที่สุด เก่าที่สุด หรือมีค่าต่ำที่สุด
-- 5 cheapest products
SELECT name, price
FROM products
ORDER BY price ASC
LIMIT 5;การเพิ่มคีย์ตัดสินกรณีเสมอ
หากหลายแถวมีค่าตรงจุดตัดเท่ากัน ฐานข้อมูลอาจเลือกแถวใดก็ได้โดยไม่มีกฎตายตัว ให้เพิ่มคีย์รองที่ไม่ซ้ำกัน เพื่อให้ผลลัพธ์คงที่และทำซ้ำได้เหมือนเดิม
SELECT id, name, price
FROM products
ORDER BY price DESC, id
LIMIT 3;N อันดับแรกหลังการกรอง
การค้นหา N อันดับแรกจะทำงานกับชุดข้อมูลที่ผ่านการกรองแล้ว ให้ใส่ส่วนคำสั่ง WHERE ก่อนเพื่อจำกัดรายการที่เป็นไปได้ จากนั้นจึงเรียงลำดับและจำกัดจำนวน
วิธีนี้ใช้ค้นหาสินค้า 3 รายการที่แพงที่สุดในหมวดหมู่ 'หนังสือ'
SELECT name, price
FROM products
WHERE category = 'Books'
ORDER BY price DESC
LIMIT 3;N อันดับแรกหลังการรวมค่า
คุณสามารถจัดอันดับค่าที่คำนวณได้เช่นกัน ให้จัดกลุ่ม รวมค่า จากนั้นเรียงลำดับค่ารวมและจำกัดจำนวน
วิธีนี้คืนค่าลูกค้า 5 รายที่ใช้จ่ายรวมมากที่สุด
SELECT customer_id, SUM(total) AS spent
FROM orders
GROUP BY customer_id
ORDER BY spent DESC
LIMIT 5;แนวทางใช้ฟังก์ชันจัดอันดับ
ฟังก์ชันหน้าต่าง เช่น ROW_NUMBER() จะกำหนดอันดับให้แต่ละแถว ให้ครอบคำสั่งค้นหาไว้ แล้วเลือกเฉพาะแถวที่มีอันดับน้อย วิธีนี้รองรับการค้นหา N อันดับแรกต่อกลุ่ม
SELECT name, price
FROM (
SELECT name, price,
ROW_NUMBER() OVER (ORDER BY price DESC) AS rn
FROM products
) ranked
WHERE rn <= 3;RANK กับ ROW_NUMBER เมื่อมีค่าเสมอกัน
ROW_NUMBER() จะให้หมายเลขที่ไม่ซ้ำกันเสมอ จึงคืนค่าแถวได้ตรงตามจำนวน N แม้จะมีค่าเสมอกัน ส่วน RANK() จะให้แถวที่เสมอกันมีหมายเลขเดียวกัน ดังนั้น "3 อันดับแรก" อาจคืนค่ามากกว่า 3 แถว หากมีค่าเสมอกันในอันดับที่สาม
SELECT name, price,
RANK() OVER (ORDER BY price DESC) AS rnk
FROM products;N อันดับแรกต่อกลุ่ม
หากต้องการสินค้าที่อยู่ในอันดับหนึ่งของแต่ละหมวดหมู่ ให้แบ่งการจัดอันดับตามหมวดหมู่ PARTITION BY จะเริ่มนับหมายเลขใหม่สำหรับทุกกลุ่ม
SELECT category, name, price
FROM (
SELECT category, name, price,
ROW_NUMBER() OVER (
PARTITION BY category
ORDER BY price DESC
) AS rn
FROM products
) t
WHERE rn = 1;DISTINCT ON สำหรับหนึ่งแถวต่อกลุ่ม
DISTINCT ON ของ PostgreSQL เป็นวิธีสั้นกระชับในการเลือกแถวอันดับหนึ่งของแต่ละกลุ่ม ให้ระบุคอลัมน์ที่ใช้จัดกลุ่ม แล้วเรียงลำดับเพื่อให้แถวที่ต้องการอยู่ก่อนภายในแต่ละกลุ่ม
SELECT DISTINCT ON (category)
category, name, price
FROM products
ORDER BY category, price DESC;รวมแถวที่เสมอกันด้วย WITH TIES
หากต้องการ 3 อันดับแรกและต้องการรวมแถวที่มีค่าเสมอกับอันดับที่ 3 ด้วย ให้ใช้ FETCH ... WITH TIES ตามมาตรฐาน วิธีนี้จะคืนค่า 3 แถว พร้อมแถวเพิ่มเติมที่มีค่าเสมอกับแถวสุดท้าย
SELECT name, price
FROM products
ORDER BY price DESC
FETCH FIRST 3 ROWS WITH TIES;ค่าอันดับหนึ่งเพียงค่าเดียว
หากต้องการเพียงแถวเดียวที่มีค่าสูงสุดหรือต่ำสุด รูปแบบ ORDER BY ... LIMIT 1 เป็นวิธีที่ง่ายที่สุด ชัดเจนกว่าและมักทำงานเร็วกว่าใช้คำสั่งค้นหาย่อยร่วมกับ MAX()
-- The single most recent order
SELECT id, total, created_at
FROM orders
ORDER BY created_at DESC
LIMIT 1;ตรวจสอบอย่างรวดเร็ว
คุณต้องการราคาสูงสุด 3 อันดับแรก แต่หากมีราคาเสมอกันในอันดับที่ 3 คุณต้องการรวมทั้งหมดไว้ด้วย
สรุปทบทวน
ขณะนี้คุณสามารถค้นหาระเบียน N อันดับแรกได้ด้วยวิธีสำคัญต่าง ๆ:
ORDER BY ... LIMIT nสำหรับรายการอันดับต้นหรืออันดับท้ายแบบง่าย- เพิ่มคีย์ตัดสินกรณีเสมอที่ไม่ซ้ำกันเพื่อให้ผลลัพธ์คงที่
ROW_NUMBER()หรือDISTINCT ONสำหรับ N อันดับแรกต่อกลุ่มFETCH ... WITH TIESเพื่อเก็บแถวที่มีค่าเสมอกัน
เท่านี้ก็ครอบคลุมการเรียงลำดับ การจำกัดจำนวน และการค้นหา N อันดับแรกแล้ว คุณสามารถจัดระเบียบผลลัพธ์ทุกชุดได้อย่างแท้จริง
SELECT name, price
FROM products
ORDER BY price DESC, id
LIMIT 3;คำถามที่พบบ่อย
บทเรียน “การค้นหาระเบียนอันดับต้น ๆ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การค้นหาระเบียนอันดับต้น ๆ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การค้นหาระเบียนอันดับต้น ๆ”
หาค่าที่สูงสุดและต่ำสุด คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การค้นหาระเบียนอันดับต้น ๆ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การเรียงลำดับด้วย ORDER BY
- การเรียงตามหลายคอลัมน์
- LIMIT และ OFFSET
- การค้นหาระเบียนอันดับต้น ๆ