【发布时间】:2019-04-07 04:38:34
【问题描述】:
我有两个 Postgres 表,如下所示,分别称为 client 和 order。
id | name
------------
41 | james
29 | melinda
36 | henry
...
id | date | volume | client_id
------------------------------
328 | 2018-01-03 | 16 | 41
411 | 2018-01-29 | 39 | 29
129 | 2018-01-13 | 73 | 29
542 | 2018-01-22 | 62 | 36
301 | 2018-01-17 | 38 | 41
784 | 2018-01-08 | 84 | 29
299 | 2018-01-10 | 54 | 36
300 | 2018-01-10 | 18 | 36
178 | 2018-01-30 | 37 | 36
...
然后我用以下逻辑写了一个查询:
i) 找出每个订单与其前一个订单之间的交易量差异,按每个客户和订单按日期分组。对于第一个订单,此列将为空。
ii) 显示客户以及每个客户的最大音量差异。
with cte AS
(SELECT t.name,
t.date,
t.volume,
t.volume - lag(t.volume) over (
ORDER BY t.name, t.date) AS change
FROM
(SELECT c.name,
o.date,
sum(o.volume) volume
FROM orders o
JOIN client c using (client_id)
GROUP BY c.name,
o.date
ORDER BY c.name,
o.date) t)
SELECT cte.name,
max(abs(change))
FROM cte
GROUP BY name
下面是结果表。
name | max
------------
james | 22
melinda | 34
henry | 25
我希望就三件事获得建议。
a) 是否可以用符号表示差异?对于客户端 ID 29 和 36,值应分别为 -34 和 -25。
b) 是否也可以显示日期?我尝试在 CTE 上选择日期列,但没有成功。
c) 有人对我如何改进查询以使其更具性能或可读性有任何一般性建议吗?
【问题讨论】:
标签: sql postgresql subquery greatest-n-per-group window-functions