聚合函数以保持特定值,具体取决于其他列

时间:2016-03-23 14:51:26

标签: postgresql postgresql-8.3

我有以下格式的数据

 id_A       id_B        val
--------------------------------
 1           1           1
 1           2           2  
 2           1           3
 2           3           4  

是否有一种很好的方法可以将id_A分组,同时保持id_A = Id_B的行值?

我需要聚合的原因是,如果没有这样的行,我想要平均值。

结果应如下所示:

 id_A       val
-----------------
 1           1
 2           3.5

我想出了以下内容,但那个案子对我来说看起来很丑陋和丑陋。

Select id_A,
    Coalesce(
        avg(case when id_A = id_B then val else null end),
        avg(val)
    ) as value
From myTable
Group by id_A; 

1 个答案:

答案 0 :(得分:1)

使用postgres 9.4+,您可以使用FILTER子句进行聚合和窗口函数:

functions. Something like this:
Select id_A,
    Coalesce(
        avg(val) filter(where id_A = id_B),
        avg(val)
    ) as value
From myTable
Group by id_A; 

详细信息:http://www.postgresql.org/docs/current/static/sql-expressions.html