Input:
Activity table:
----------- ----------- ------------ --------------
| player_id | device_id | event_date | games_played |
----------- ----------- ------------ --------------
| 1 | 2 | 2016-03-01 | 5 |
| 1 | 2 | 2016-05-02 | 6 |
| 1 | 3 | 2017-06-25 | 1 |
| 3 | 1 | 2016-03-02 | 0 |
| 3 | 4 | 2018-07-03 | 5 |
----------- ----------- ------------ --------------
Output:
----------- ------------ ---------------------
| player_id | event_date | games_played_so_far |
----------- ------------ ---------------------
| 1 | 2016-03-01 | 5 |
| 1 | 2016-05-02 | 11 |
| 1 | 2017-06-25 | 12 |
| 3 | 2016-03-02 | 0 |
| 3 | 2018-07-03 | 5 |
----------- ------------ ---------------------
我正在嘗試為該玩家在日期 asc 中玩的游戲做累積總和。
select player_id, event_date, sum(games_played) over(partition by player_id order by event_date) as games_played_so_far
from Activity a
order by player_id
我無法理解帶 sum 的視窗函式如何回傳所需的輸出。
例如, over(partition by player_id order by event_date) ,這不是在按日期排序的一組中回傳玩家 id= 1 然后給出 sum 應該回傳總日期嗎?但這里給出的是累積總和。請提供一些清晰度
uj5u.com熱心網友回復:
表達方式
sum(games_played) over (partition by player_id order by event_date)
將視窗定義為從最早event_date到當前記錄的記錄組,該組記錄按 排序event_date。因此,它生成了玩游戲次數的累積總和。該PARTITION條款意味著每組玩家記錄將有一個單獨的累積總和。
uj5u.com熱心網友回復:
如果我得到它
讓我們看看 sum window-function 的最后一部分
over(partition by player_id order by event_date)
- “partition by”部分的意思是“重新從0開始計算”
- “order by”的意思是“這是應該從一行到另一行添加的內容
如果缺少“order by”部分,資料庫沒有膠水如何計算一步一步的總和,所以它只會計算整個組的總和(partition by 子句)并為該組的每一行顯示它
在這里看到dbfiddle
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/322100.html
標籤:mysql
上一篇:從多個表插入一個表(MySql)
下一篇:續集節點表達javascript
