【问题标题】:Aggregate window functions with an ORDER BY clause require a frame clause SQL带有 ORDER BY 子句的聚合窗口函数需要一个框架子句 SQL
【发布时间】:2022-08-17 03:39:07
【问题描述】:

我正在 Redshift 工作以进行查询。我正在尝试填写用户购买的最后一个非空值。但是我不断收到此错误:带有 ORDER BY 子句的聚合窗口函数需要一个框架子句。我不确定为什么。这是我当前的查询:

    with table_a as (
    select 
    user_id,
    date,
    ,SUM(CASE WHEN purchase_amount IS NULL THEN 0 ELSE 1 END) OVER (PARTITION BY user_id ORDER BY date rows between unbounded preceding and unbounded following) AS grp

    )
    select *,
  FIRST_VALUE(purchase_amount) OVER (PARTITION BY grp, user_id ORDER BY date) AS test
 from table_a 
  • 尝试在 FIRST_VALUE 窗口函数构造中,在 ORDER BY 子句之后添加 rows between unbounded preceding and unbounded following
  • 你能更好地指出错误吗?也许您可以将SUM()FIRST_VALUE() 注释掉,以便我们知道是哪一个造成了麻烦。

标签: sql amazon-redshift


【解决方案1】:

需要框架子句来指示要考虑框架中的哪些行子集。当您添加 order by 子句时,数据库希望您只想查看框架的子集。例如,让我们以 SUM() 窗口函数为例。

您现在拥有的窗口:

SUM(CASE WHEN purchase_amount IS NULL THEN 0 ELSE 1 END) OVER (PARTITION BY user_id ORDER BY date rows between unbounded preceding and unbounded following)

与没有order by和frame子句的window函数完全一样。它将在分区中的每一行上产生分区中所有行的总和 - 每行上的值完全相同。这个更简单的代码如下所示:

SUM(CASE WHEN purchase_amount IS NULL THEN 0 ELSE 1 END) OVER (PARTITION BY user_id)

执行此计算不需要 order by 子句,因此当您添加它时,数据库会认为您犯了错误。

如果您想要滚动总和,则需要 order by 子句,但 frame 子句也是如此。这些定义了对每一行求和的行。滚动总和如下所示:

SUM(CASE WHEN purchase_amount IS NULL THEN 0 ELSE 1 END) OVER (PARTITION BY user_id ORDER BY date rows between unbounded preceding and current row)

简短的回答是,当您有 order by 子句时,数据库认为您想要对框架中的行进行子选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-07
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 2021-01-21
    相关资源
    最近更新 更多