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

aggregate function to keep specific value, depending of other columns

我有以下格式的数据

 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; 

在 postgres 9.4+ 中,您可以对聚合和 window 函数使用 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