列“f.price”必须出现在GROUP BY子句中或用于聚合函数,但我已经使用了窗口函数

问题描述 投票:1回答:2

我有一个有两列的表:dateprice。它们都不是唯一的。

我需要以唯一的日期顺序运行总计(一个日期 - 此日期的值总和,下一个日期 - 下一个总和+前一个等等)。

我知道如何使用子查询执行此操作,但我想使用窗口函数:

有一个简单的查询:

SELECT f.date, SUM(f.price) OVER () FROM f GROUP BY f.date

它返回错误:

f.price必须出现在GROUP BY子句中或用于聚合函数

但我已经使用了聚合函数(SUM)。

有人能告诉我为什么会这样吗?

sql postgresql
2个回答
0
投票

尽量避免过度()

select f.date,
   SUM(f.price) 
from f
group by f.date

0
投票

您正在混合窗口函数和聚合,这通常不是一个好主意。您收到错误的原因是,实际上,列f.price未在聚合函数中使用(它使用窗口函数)。

我相信以下查询应该可以满足您的需求。它使用窗口函数,并依赖于DISTINCT而不是聚合。

SELECT DISTINCT fdate, SUM(fprice) OVER(ORDER BY fdate) FROM f ORDER BY fdate;

Demo on DB Fiddle

请考虑以下示例数据,它们似乎与您的规范相符:

| fdate                    | fprice |
| ------------------------ | ------ |
| 2018-01-01T00:00:00.000Z | 1      |
| 2018-01-01T00:00:00.000Z | 2      |
| 2018-01-02T00:00:00.000Z | 3      |
| 2018-01-03T00:00:00.000Z | 4      |
| 2018-01-03T00:00:00.000Z | 1      |

该查询将返回:

| fdate                    | sum |
| ------------------------ | --- |
| 2018-01-01T00:00:00.000Z | 3   |
| 2018-01-02T00:00:00.000Z | 6   |
| 2018-01-03T00:00:00.000Z | 11  |
© www.soinside.com 2019 - 2024. All rights reserved.