SQL Query中移位范围的总和

时间:2016-02-16 04:36:52

标签: sql postgresql amazon-redshift

我正在尝试编写一个有效的查询,以从关系数据库表中获取前7天值的总和,并记录每个总数与7天期间的最终日期(例如,'WeeklyTotals表'中的以下示例)。例如,在我的WeeklyTotals查询中,我希望2月15日的值为333,因为这是2月9日 - 2月15日的用户总数,依此类推:

Example of desired outcome

我有一个基本查询,它让我在今天的日期使用了前几周的用户(为了示例而简化):

SELECT Date, Sum("Total Users")
FROM "UserRecords"
WHERE (dateadd(hour, -8, "UserRecords"."Date") BETWEEN 
    dateadd(hour, -8, sysdate) - INTERVAL '7 DAY' AND dateadd(hour, -8, sysdate);

问题是,这只是今天的日期的总和。我需要一个查询来获取前七天的这些信息。

我知道我可以为每个日期创建一个视图(因为我只需要前面的七个条目)并将它们连接在一起,但这似乎效率很低(我必须创建/更新7个视图,然后执行所有操作)内连接操作)。我想知道是否有更有效的方法来实现这一点。

3 个答案:

答案 0 :(得分:2)

如果没有间隙,您可以使用包含前六行的SUM OVER的运行总计。使用ROW_NUMBER排除前六个记录,因为它们的总数不代表完整的几周。

select log_date, week_total
from
(
  select 
    log_date, 
    sum(total_users) over (order by log_date rows 6 preceding) as week_total,
    row_number() over (order by log_date) as rn
  from mytable
  where log_date > 0
)
where rn >= 7
order by log_date;

更新:如果存在空白,则应为

sum(total_users) over (order by log_date range interval '6' day preceding)

但我不知道PostgreSQL是否支持这一点。 (此外,ROW_NUMBER排除将不起作用,并且必须由其他东西替换。)

答案 1 :(得分:1)

这是一个自我加入前6天的查询,并将该值汇总得到每周总数:

select u1.date, sum(u2.total_users) as weekly_users
from UserRecords u1
join UserRecords u2
    on u1.date - u2.date < 7
    and u1.date >= u2.date
group by u1.date
order by u1.date

答案 2 :(得分:1)

您可以使用SUMDate Part覆盖窗口功能,使用week的表达式{{3}}。

自连接比Window函数慢得多。