,我有以下一組數據:奇怪的窗函數的行爲
player | score | day
--------+-------+------------
John | 3 | 02-01-2014
John | 5 | 02-02-2014
John | 7 | 02-03-2014
John | 9 | 02-04-2014
John | 11 | 02-05-2014
John | 13 | 02-06-2014
Mark | 2 | 02-01-2014
Mark | 4 | 02-02-2014
Mark | 6 | 02-03-2014
Mark | 8 | 02-04-2014
Mark | 10 | 02-05-2014
Mark | 12 | 02-06-2014
給定兩個時間段:
02-01-2014..02-03-2014
02-04-2014..02-06-2014
我需要得到平均分對於給定時間範圍內的每個玩家。最終的結果我想實現的是:
player | period_1_score | period_2_score
--------+----------------+----------------
John | 5 | 11
Mark | 4 | 10
我想出了原來的算法是:
- 執行
SELECT
有兩個值,通過劃分組分數推斷爲雙方各持兩份時間段 - 第一個
SELECT
,執行另一個,按玩家名稱分組。
我卡在第1步:運行下面的查詢:
SELECT
player,
AVG(score) OVER (PARTITION BY day BETWEEN '02-01-2014' AND '02-03-2014') AS period_1,
AVG(score) OVER (PARTITION BY day BETWEEN '02-04-2014' AND '02-06-2014') AS period_2;
獲取我的結果不正確(注意:period1
和period2
平均分成績如何都是相同的:
player | period_1_score | period_2_score
--------+----------------+----------------
John | 5 | 5
John | 5 | 5
John | 5 | 5
John | 5 | 5
John | 5 | 5
John | 5 | 5
Mark | 4 | 4
Mark | 4 | 4
Mark | 4 | 4
Mark | 4 | 4
Mark | 4 | 4
Mark | 4 | 4
我想我不完全理解窗口函數是如何工作的...我有兩個問題:
- 我的查詢出了什麼問題?
- 我該怎麼做對不對?
爲什麼你將日期存儲爲字符串而不是'DATE'?更糟糕的是,你爲什麼要在第一天(或本月)和上一年存儲它們? –
我們(和SQL-Server)應該知道'02 -06-2014'是6月2日還是2月6日?您是否意識到,如果您將日期存儲爲字符串並使用此格式,那麼「02-06-2014」的「日期」將被視爲晚於「date」「01-01-2020」服務器? –