【问题标题】:Use a regular aggregative function (sum) alongside a window function在窗口函数旁边使用常规聚合函数(sum)
【发布时间】:2019-12-04 06:02:10
【问题描述】:

我正在阅读 this 关于如何计算运行总计的教程。

复制建议的方法我有一个表单查询:

select
    date,
    sum(sales) over (order by date rows unbounded preceding) as cumulative_sales
from sales_table;

这可以正常工作并且可以满足我的要求 - 按日期计算总计。

不过,除了总销售额之外,我还想添加每日销售额:

select
    date,
    sum(sales),
    sum(sales) over (order by date rows unbounded preceding) as cumulative_sales
    from sales_table
group by 1;

这会引发错误:

SYNTAX_ERROR: line 6:8: '"sum"("sales") OVER (ORDER BY "activity_date" ASC ROWS UNBOUNDED PRECEDING)' 必须是聚合表达式或出现在 GROUP BY 子句中

如何计算每日总计和运行总计?

【问题讨论】:

    标签: sql presto


    【解决方案1】:

    我认为您可以尝试一下,但它会重复您的 daily_sales。这样您就不需要按日期字段分组了。

    SELECT date,
           SUM(sales) OVER (PARTITION BY DATE) as daily_sales
           SUM(sales) OVER (ORDER BY DATE ROWS UNBOUNDED PRECEDING) as cumulative_sales
      FROM sales_table;
    

    【讨论】:

      【解决方案2】:

      大概,您打算以以下方式开始聚合查询:

      select date, sum(sales) as daily_sales,
             sum(sum(sales)) over (order by date rows unbounded preceding) as cumulative_sales
      from sales_table
      group by date
      order by date;
      

      【讨论】:

      • 只是想理解这一点。你在那里有一个嵌套的 sum() 。为什么?此外,这是否会返回与上述劳伦斯的回答不同的结果
      • 看起来它无论如何都会返回完全相同的结果,我只是发现它的可读性较低,因为嵌套的 sum(sum())
      • @DougFir。 . .这将返回每个日期一行。我没有理由认为销售表每个日期只有一行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2020-08-05
      相关资源
      最近更新 更多