如何从同一列但不同的行划分两个值

时间:2017-05-05 14:30:10

标签: postgresql

我有一张这样的表:

postcode | value | uns
AA       | 10    | 51
AB       | 20    | 78
AA       | 20    | 78
AB       | 50    | 51

我希望得到一个结果:

AA | 0.5 
AB | 2.5

其中新值是valueuns = 51valueuns = 78之间相同邮政编码的划分。 我怎么能用Postgres做到这一点?我已经检查了窗口函数和分区,但我不知道该怎么做。

2 个答案:

答案 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 = 51t.uns = 78的行,则可以改为使用full join(可能coalesce()为缺失的行提供默认值)。

答案 1 :(得分:0)

pozs的解决方案很简单,没有任何问题。只需添加两个选项:

1。相关子查询

SELECT postcode
     , value / (SELECT NULLIF(value, 0) FROM t WHERE postcode = uns51.postcode AND uns = 78)
FROM   t uns51
WHERE  uns = 51;

只有一行或几行。

2。条件聚合

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