【问题标题】:Sum of shifting range in SQL QuerySQL 查询中的移位范围之和
【发布时间】:2016-02-16 04:36:52
【问题描述】:

我正在尝试编写一个有效的查询,以从关系数据库表中获取前 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 天的这些信息。

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

【问题讨论】:

  • 在标签中添加你的数据库...
  • 日期系列有间隔吗?
  • redshift是否实现了窗口功能?

标签: sql postgresql amazon-redshift


【解决方案1】:

如果没有间隙,您可以使用包含前六行的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 排除在那时将不起作用,必须用其他东西替换。)

【讨论】:

    【解决方案2】:

    这是一个查询,它自我连接到前 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
    

    【讨论】:

      【解决方案3】:

      您可以使用SUM over Window 函数,表达式使用Date Partweek

      自连接比窗口函数慢得多。

      【讨论】:

        猜你喜欢
        • 2021-11-15
        • 2020-05-14
        • 2019-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-21
        • 1970-01-01
        相关资源
        最近更新 更多