我有以下一组数据:
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
给定两个时间范围:
2014年2月1日..2014年2月3日
2014年4月2日..2014年2月6日
我需要获得给定时间范围内每个玩家的平均得分。我想要实现的最终结果是这样的:
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
我想我不完全理解窗口函数是如何工作的......我有两个问题:
- 我的查询出了什么问题?
- 我该如何做才是正确的?
最佳答案
为此您不需要窗口函数。 尝试:
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
关于sql - 奇怪的窗口函数行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21791211/