2014-02-14 111 views
2

,我有以下一組數據:奇怪的窗函數的行爲

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 

給定兩個時間段:

  1. 02-01-2014..02-03-2014
  2. 02-04-2014..02-06-2014

我需要得到平均分對於給定時間範圍內的每個玩家。最終的結果我想實現的是:

player | period_1_score | period_2_score 
--------+----------------+---------------- 
    John |    5 |    11 
    Mark |    4 |    10 

我想出了原來的算法是:

  1. 執行SELECT有兩個值,通過劃分組分數推斷爲雙方各持兩份時間段
  2. 第一個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; 

獲取我的結果不正確(注意:period1period2平均分成績如何都是相同的:

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 

我想我不完全理解窗口函數是如何工作的...我有兩個問題:

  1. 我的查詢出了什麼問題?
  2. 我該怎麼做對不對?
+0

爲什麼你將日期存儲爲字符串而不是'DATE'?更糟糕的是,你爲什麼要在第一天(或本月)和上一年存儲它們? –

+0

我們(和SQL-Server)應該知道'02 -06-2014'是6月2日還是2月6日?您是否意識到,如果您將日期存儲爲字符串並使用此格式,那麼「02-06-2014」的「日期」將被視爲晚於「date」「01-01-2020」服務器? –

回答

2

您不需要窗口功能。 嘗試:

select 
player 
,avg(case when day BETWEEN '02-01-2014' AND '02-03-2014' then score else null end) as period_1_score 
,avg(case when day BETWEEN '02-04-2014' AND '02-06-2014' then score else null end) as period_1_score 
from <your data> 
group by player 
+1

Yakshemash。我建議你稍微小心 - http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx chenqui。 –

+1

@BoratSagdiyev不相關 - 這個問題不涉及日期時間。 – 2014-02-14 23:46:14

+0

非常感謝,@ user102890! – gmile