【问题标题】:Issues with SQL window function- error that column must be aggregated or in group bySQL 窗口函数的问题 - 列必须聚合或分组的错误
【发布时间】:2021-11-15 06:18:26
【问题描述】:

我有一个名为“sales”的表,其中包含两列:transaction_date 和 transaction_amount:VALUES ('2020-01-16 00:05:54.000000', '122.02'), ('2020-01-07 20:53:04.000000', '1240.00') 我想找到 2020 年 1 月每一天的 3 天移动平均线。我返回的错误是 transaction_amount 必须包含在聚合函数或 group by 中。按它分组是没有意义的,因为我只希望结果表中每天有一个条目。在我的代码中,我已经在聚合函数 SUM 中有金额,所以我不确定还有什么可以尝试的。到目前为止,这是我的查询:

SELECT EXTRACT(DAY FROM transaction_time) AS Jan20_day, SUM(transaction_amount), SUM(transaction_amount) OVER(ORDER BY EXTRACT(DAY FROM transaction_time) ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS rolling_average FROM sales WHERE EXTRACT(MONTH FROM transaction_time)=1 AND EXTRACT(YEAR FROM transaction_time)=2020 GROUP BY EXTRACT(DAY FROM transaction_time)

关于我为什么返回以下错误的任何见解?

Query Error: error: column "transactions.transaction_amount" must appear in the GROUP BY clause or be used in an aggregate function

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。
  • 是一个样本数据集,不在线。这里有更多值:VALUES ('2020-01-14 22:55:37.000000', '12.18'), ('2020-01-22 00:26:12.000000', '12.67'), ('2020-01-19 02:33:10.000000', '12.22'), ('2020-01-10 10:22:14.000000', '53.60'), ('2020-01-04 01:27:34.000000', '29.13')

标签: sql group-by window-functions


【解决方案1】:

我希望是这样的:

SELECT EXTRACT(DAY FROM transaction_time) AS Jan20_day, 
       SUM(transaction_amount),
       SUM(SUM(transaction_amount)) OVER (ORDER BY EXTRACT(DAY FROM transaction_time) ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS rolling_average
FROM sales
WHERE transaction_time >= DATE '2020-01-01' AND
      transaction_time < DATE '2020-02-01'
GROUP BY EXTRACT(DAY FROM transaction_time);

但是您查询的基本问题是您需要将窗口函数应用于SUM(),因此SUM(SUM(transaction_amount)) . . .

【讨论】:

    【解决方案2】:

    需要在Where子句之前使用GroupBy

    • GROUP BY 子句与 SELECT 语句一起使用。在查询中,
    • GROUP BY 子句放在 WHERE 子句之后。在查询中,
    • GROUP BY 子句放在 ORDER BY 子句之前(如果有的话)。

    SELECT EXTRACT(DAY FROM transaction_time) AS Jan20_day, SUM(transaction_amount), 
    SUM(transaction_amount) 
    OVER(ORDER BY EXTRACT(DAY FROM transaction_time) 
    ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS rolling_average 
    FROM sales 
    WHERE EXTRACT(MONTH FROM transaction_time)=1 
    GROUP BY {property}
    AND EXTRACT(YEAR FROM transaction_time)=2020 GROUP BY EXTRACT(DAY FROM transaction_time)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      • 2021-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多