我正在尝试编写一个有效的查询,以从关系数据库表中获取前7天值的总和,并记录每个总数与7天期间的最终日期(例如,'WeeklyTotals表'中的以下示例)。例如,在我的WeeklyTotals查询中,我希望2月15日的值为333,因为这是2月9日 - 2月15日的用户总数,依此类推:
我有一个基本查询,它让我在今天的日期使用了前几周的用户(为了示例而简化):
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个视图,然后执行所有操作)内连接操作)。我想知道是否有更有效的方法来实现这一点。
答案 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)