,我有以下一组数据:奇怪的窗函数的行为
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”服务器? –