我有一张这样的表:
postcode | value | uns
AA | 10 | 51
AB | 20 | 78
AA | 20 | 78
AB | 50 | 51
我希望得到一个结果:
AA | 0.5
AB | 2.5
其中新值是value
与uns = 51
和value
与uns = 78
之间相同邮政编码的划分。
我怎么能用Postgres做到这一点?我已经检查了窗口函数和分区,但我不知道该怎么做。
答案 0 :(得分:2)
如果(postcode, uns)
是唯一的,那么您只需要一个自我加入:
select postcode, uns51.value / nullif(uns78.value, 0)
from t uns51
join t uns78 using (postcode)
where uns51.uns = 51
and uns78.uns = 78
如果可能缺少t.uns = 51
或t.uns = 78
的行,则可以改为使用full join
(可能coalesce()
为缺失的行提供默认值)。
答案 1 :(得分:0)
pozs的解决方案很简单,没有任何问题。只需添加两个选项:
SELECT postcode
, value / (SELECT NULLIF(value, 0) FROM t WHERE postcode = uns51.postcode AND uns = 78)
FROM t uns51
WHERE uns = 51;
只有一行或几行。
SELECT postcode
, min(value) FILTER (WHERE uns = 51)/ NULLIF(min(value) FILTER (WHERE uns = 78), 0)
FROM t
GROUP BY postcode;
处理大部分或全部表格时可能会更快
也可以按(postcode, uns)
处理重复项,使用您选择的聚合函数从每个组中选择正确的值。对于每个组中仅一个行,min()
与max()
或sum()
一样好。
关于FILTER
: