Ranking Functions คือ ฟังก์ชั่นที่ใช้ในการจัดอันดับข้อมูล ซึ่งใน SQL Script ที่ใช้บ่อยๆ ก็ได้แก่ ROW_NUMBER(),  RANK(), DENSE_RANK()  ซึ่งแต่ละคำสั่งมีการใช้งานที่แตกต่างกันดังนี้
1. ROW_NUMBER() ใช้สำหรับรันตัวเลขลำดับให้ข้อมูลแต่ละ Row ซึ่งมีวิธีการเขียนดังนี้
SELECT ROW_NUMBER() OVER(ORDER BY Segment, Country, Product) as Row_No
,[Segment]
,[Country]
,[Product]
,[Discount Band]
,[Units Sold]
,[Manufacturing Price]
,[Sale Price]
,[Gross Sales]
,[Discounts]
,[Sales]
,[COGS]
,[Profit]
,[Date]
,[Month Number]
,[Month Name]
,[Year]
FROM [DEV_DB].[dbo].[financial_sample]

ผลลัพธ์ที่ได้จากการรัน Script 

2. RANK() เป็นการรันตัวเลขลำดับให้กับข้อมูลที่เป็นชุดเดียวกัน เช่น หากเรามีข้อมูลชุดเดียวกัน 3 Row คำสั่ง Rank() ก็จะให้ค่าตัวเลขเดียวกัน ทั้ง 3 Row มีวิธีการเขียนคล้ายๆกับข้างบนดังนี้
จาก script ด้านล่างจะเป็นการรันตัวเลขให้กับชุดของข้อมูล Segment, Country, Product,[Discount Band] โดยเรียงค่าผลรวม [Units Sold]  จากน้อยไปมาก หากต้องการจัดกลุ่มมากกว่านี้สามารถเพิ่มฟิลล์เข้าไปได้
SELECT RANK() OVER(ORDER BY SUM(CAST([Units Sold] AS FLOAT))) AS Row_No
,[Segment]
,[Country]
,[Product]
,[Discount Band]
,sum(cast([Units Sold] as float)) as [Total Units Sold]
FROM [DEV_DB].[dbo].[financial_sample]
GROUP BY [Segment],[Country],[Product],[Discount Band]

ผลลัพธ์ที่ได้จากการรัน Script  จากรูปอธิบายได้ว่า Row_No = 24 ถูกเพิ่มให้กับ 3 Rows เพราะเราจัด Ranking ตามยอดรวมของ [Units Sold]  ซึ่งมีค่า 615 เท่ากัน


3. DENSE_RANK() เหมือน RANK() แต่จะไม่เว้นแถวที่มีอันดับรายการที่ซ้ำกัน  ยกตัวอย่างความแตกต่างระหว่าง RANK() กับ DENSE_RANK() ได้ดังนี้
RANK() จะรัน number ตาม row ของข้อมูลจริงๆ เช่น row ที่ 66 และ 67  ถูก add ค่าให้เป็นเลข 66   จากนั้น row ที่ 68 จะ add ค่า 68 ให้โดยข้ามค่า running number ที่เป็น 67
DENSE_RANK()   จะรัน number  ต่อเนื่อง โดยไม่มีการข้ามเลข running number  เช่น Row_No 21 แล้วเป็น 22,23,24,25 … ไปเรื่อยๆ

Good Luck  Na ^_^

TG Facebook Comments