Postgresql将行与空项结合起来

时间:2018-02-12 17:55:22

标签: sql postgresql

我有一张这样的表

ts                    itemA         itemB         itemC         
2018-02-03 12:00:00   1             null          null          
2018-02-03 12:00:00   null          2             6
2018-02-03 12:00:00   null          2             4
2018-02-03 12:01:00   null          3             6
2018-02-03 12:01:00   null          2             4

希望输出看起来像

ts                    itemA         itemB         itemC         
2018-02-03 12:00:00   1             2             5
2018-02-03 12:01:00   null          3             6
2018-02-03 12:01:00   null          2             4

我尝试按时间分组使用& itemB,得到itemC的平均值。 但无法弄清楚如何组合空项目

select ts, mode() within group (order by itemA), itemB, avg(itemC) group by ts, itemB;

2 个答案:

答案 0 :(得分:0)

我想你可能想要:

SELECT ts,
MAX(IFNULL(itemA, 0)) AS itemA,
IFNULL(itemB, 0) AS itemB,
AVG(itemC)
FROM t
GROUP BY ts, IFNULL(itemB, 0)

答案 1 :(得分:0)

您需要从聚合中删除itemB。也许:

select ts, mode() within group (order by itemA) as itemA,
       max(itemB) as itemB, avg(itemC) as itemC
from t
group by ts;

编辑:

正式地,你可以这样做:

select ts, mode() within group (order by itemA) as itemA,
       itemBB, avg(itemC) as itemC
from (select t.*, coalesce(itemB, max(itemB) over (partition by ts)) as itemBB,
      from t
     ) t
group by ts, itemBB;

这适用于您的示例数据,但我不确定这是您真正想要的逻辑。