我有一个有两列的表:date
和price
。它们都不是唯一的。
我需要以唯一的日期顺序运行总计(一个日期 - 此日期的值总和,下一个日期 - 下一个总和+前一个等等)。
我知道如何使用子查询执行此操作,但我想使用窗口函数:
有一个简单的查询:
SELECT f.date, SUM(f.price) OVER () FROM f GROUP BY f.date
它返回错误:
列
f.price
必须出现在GROUP BY
子句中或用于聚合函数
但我已经使用了聚合函数(SUM
)。
有人能告诉我为什么会这样吗?
尽量避免过度()
select f.date,
SUM(f.price)
from f
group by f.date
您正在混合窗口函数和聚合,这通常不是一个好主意。您收到错误的原因是,实际上,列f.price
未在聚合函数中使用(它使用窗口函数)。
我相信以下查询应该可以满足您的需求。它使用窗口函数,并依赖于DISTINCT
而不是聚合。
SELECT DISTINCT fdate, SUM(fprice) OVER(ORDER BY fdate) FROM f ORDER BY fdate;
请考虑以下示例数据,它们似乎与您的规范相符:
| 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 |