【发布时间】:2021-03-29 13:56:46
【问题描述】:
我似乎无法理解如何在单个查询中做一件简单的事情。
我有一个表格,其中包含每天结束时系统中存在的项目余额:
CREATE TEMPORARY TABLE t1 (
item character varying(10),
storage_date date,
qty integer
);
COPY t1 (item, storage_date, qty) FROM stdin;
A 2021-01-01 10
A 2021-01-02 10
A 2021-01-03 10
A 2021-01-04 5
A 2021-01-05 3
B 2021-01-01 1
B 2021-01-02 2
B 2021-01-03 100
B 2021-01-04 50
\.
我需要获取每个期间存储的平均项目数以及期末每个项目的余额。
假设期间在 2021-01-01 和 2021-01-05 之间。
现在,当然,平均值很简单:
SELECT item, sum(qty)/5 FROM t1 GROUP BY item ORDER BY item;
item | avg
------+-----
A | 7
B | 30
(2 rows)
但我需要它还包括该期间最后日期 = 2021-01-05 的每个项目的余额(数量)(如您所见,项目 B 也没有该日期的条目,这意味着库存那时是 0。但是如果它是 NULL 或 0 就可以了)。 通缉:
item | avg | balance at end of period
------+-----+---------
A | 7 | 3
B | 30 | NULL
(2 rows)
我尝试使用 last_value() 聚合函数:
SELECT item,last_value(qty) OVER (ORDER BY storage_date),sum(qty)/5 from t1 group by 1,2;
但这显然行不通(我对更高级的 SQL 不熟悉;JOINS、GROUP BY 和 HAVING 是我所理解的)。
我错过了什么?肯定有一些简单的方法而不是编写两个查询?
【问题讨论】:
标签: sql postgresql group-by aggregate