sql - 奇怪的窗口函数行为

标签 sql postgresql window-functions

我有以下一组数据:

 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. 2014年2月1日..2014年2月3日
  2. 2014年4月2日..2014年2月6日

我需要获得给定时间范围内每个玩家的平均得分。我想要实现的最终结果是这样的:

 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. 我该如何做才是正确的?

最佳答案

为此您不需要窗口函数。 尝试:

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/

相关文章:

java - SQLite数据库,在第二个数字后插入punt

postgresql - pgAdmin 错误 - 关系 "[name of function/Views/Trigger Functions]"不存在

sql - 累计重复次数

sql - 为什么派生列组件的表达式不能在 SSIS 中使用空值?

java - asp classic sql server 2005无法连接

postgresql - 返回从未与任何行中特定列中的值相关联的用户的名称

sql - 无法生成 SQL 查询

mysql - 如何计算MYSQL中用户连续被标记为橙色的天数?

mysql - 如何使用窗口函数计算行值与其他行值(特别是排除该行)的差值之和

mysql - SQL 完全外连接或联合