0Pricing
SQL Academy · บทเรียน

การค้นหาระเบียนอันดับต้น ๆ

หาค่าที่สูงสุดและต่ำสุด

การค้นหาระเบียนอันดับต้น ๆ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. การเรียงลำดับด้วย ORDER BY
  2. การเรียงตามหลายคอลัมน์
  3. LIMIT และ OFFSET
  4. การค้นหาระเบียนอันดับต้น ๆ
← กลับไปที่ SQL Academy