跳到主要內容
Cypher's Practical Coding
正在準備工作環境...

窗口函數入門

GROUP BY 會把資料「壓扁」— 10 筆變 3 組。但有時候你想保留每一筆資料,同時附上統計結果。例如:每筆訂單旁邊顯示「這個客戶的平均訂單金額」。這就是窗口函數。

  • 窗口函數 = 在每一行旁邊「開一扇窗」,看到一組相關資料的統計
  • 語法:函數() OVER (PARTITION BY 分組 ORDER BY 排序)
  • 不會壓扁資料,每一行都還在

ROW_NUMBER:排名

每個客戶的訂單按金額排名:

SUM / AVG OVER:累計與移動平均

每筆訂單旁邊顯示該客戶的累計消費:

RANK vs DENSE_RANK

商品價格排名(有同分時的差異):

AI 協作:學了這個,跟 AI 怎麼配合?

窗口函數是 AI 最常寫錯 PARTITION BY 的地方——分組錯了,排名就全錯。

你的人類優勢:

  • 你知道排名要「在什麼範圍內」排(全公司 vs 每個部門 vs 每個月份)
  • 你能驗證 ROW_NUMBER / RANK 的結果是否符合預期

可以這樣跟 AI 說:

幫我算每個客戶在「各自城市裡」的消費排名,用 RANK() OVER (PARTITION BY city ORDER BY total DESC)。

練習題

互動示範

DEMO 1可以修改程式碼試玩
DEMO 2可以修改程式碼試玩
DEMO 3可以修改程式碼試玩

挑戰任務

Task 1

為所有商品按價格由高到低加上排名(顯示 name、price、rank),用 ROW_NUMBER

Task 2

計算每個客戶的訂單累計金額(顯示 customer_id、order_date、total_amount、running_total),按日期排序

Task 3

找出每個客戶金額最高的訂單(用窗口函數 + 子查詢,顯示 customer_id、order_date、total_amount)

BackNext Lesson →