2014-02-14 116 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