การจัดอันดับนักกีฬาจากหลายประเทศ
ในแบบฝึกหัดที่แล้ว เราใช้ RANK เพื่อจัดอันดับให้กับนักกีฬากลุ่มหนึ่ง แต่ในข้อมูลจริง มักมีหลายกลุ่มอยู่ในชุดข้อมูลเดียวกัน หากไม่แบ่ง partition ข้อมูล ค่าของกลุ่มหนึ่งจะส่งผลต่อการจัดอันดับของกลุ่มอื่น
นอกจากนี้ RANK จะข้ามตัวเลขเมื่อมีค่าที่เท่ากัน แต่วิธีที่เป็นธรรมชาติที่สุดในการจัดอันดับคือการไม่ข้ามตัวเลข ถ้าสองประเทศได้อันดับสองร่วมกัน ประเทศถัดไปควรได้อันดับสาม ไม่ใช่อันดับสี่
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
PostgreSQL Summary Stats and Window Functions
คำแนะนำการฝึกหัด
- จัดอันดับนักกีฬาของแต่ละประเทศตามจำนวนเหรียญที่ได้รับ โดยยิ่งได้เหรียญมาก ยิ่งได้อันดับสูง และไม่ข้ามตัวเลขในกรณีที่มีค่าเท่ากัน
แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำ
ลองทำแบบฝึกหัดนี้โดยเติมโค้ดตัวอย่างนี้ให้สมบูรณ์
WITH Athlete_Medals AS (
SELECT
Country, Athlete, COUNT(*) AS Medals
FROM Summer_Medals
WHERE
Country IN ('JPN', 'KOR')
AND Year >= 2000
GROUP BY Country, Athlete
HAVING COUNT(*) > 1)
SELECT
Country,
-- Rank athletes in each country by the medals they've won
___,
___ OVER (PARTITION BY ___
ORDER BY Medals DESC) AS Rank_N
FROM Athlete_Medals
ORDER BY Country ASC, RANK_N ASC;