相关的子查询,聚合和分组

时间:2012-12-07 22:14:52

标签: sql postgresql

我遇到了查询问题,我正在使用postgresql 9.2。

我创建了一个视图,它返回一个键值,一个时间戳和一个如下所示的间隔:

select * from foo.a;  -- My view and the results

 k  |         ts1            |  tm
 1  | 2011-12-08 06:46:00+00 | 01:00:00
 1  | 2011-12-08 09:14:00+00 | 01:00:00
 2  | 2011-12-08 02:00:00+00 | 02:00:00
 2  | 2011-12-08 05:00:00+00 | 02:00:00
 4  | 2011-12-08 10:06:00+00 | 02:00:00
 4  | 2011-12-08 13:31:00+00 | 02:00:00
 1  | 2011-12-11 03:00:00+00 | 01:00:00
 1  | 2011-12-11 04:49:00+00 | 02:00:00
 4  | 2011-12-11 10:06:00+00 | 02:00:00
 4  | 2011-12-11 13:31:00+00 | 02:00:00

我的搜索结果中有大约8,000行。现在,我想按键加上间隔和组合,所以我这样做:

select k,
       sum(tm) as tm
  from foo.a
group by k;

正如所料,我的结果是:

k   |  tm
1   | 5:00
2   | 4:00
4   | 8:00

我想更进一步并执行此操作(错误 - 错误:子查询使用来自外部查询的未分组列'ts1')。

select k,
       sum(tm) as tm,
       (select sum(tm) where ts1 > '2011-12-09')
        -- (select sum(tm) where ts1 > '2012-01-01')
        -- I need to the above on 5 different dates. 
  from foo.a
  group by k,

期望的结果是:

k    |   tm   |  tm1
1    |  5:00  |  3:00
2    |  4:00  |  
4    |  8:00  |  4:00

如果我将ts1添加到我的group子句中,它自然不会返回所需的结果 - 因为我不想按ts1分组,只有k。我可以在聚合函数中使用ts1,并且查询将以不良结果运行。

这有效:

select foo.a.k,
       bar.tm1,
       sum(tm)
  from foo.a
  left join
      (select k,
              sum(tm) as tm1
         from foo.a
        where foo.a.ts1 > '2011-12-09'
        group by k) as bar
  on foo.a.k = bar.k
  group by foo.a.k,
           bar.tm1;

但查询相同信息的相同视图似乎是错误的和不必要的。特别是,因为我必须这样做5次。

我的问题:是否有解决方法在未组合列上执行相关查询?如果没有,有什么更好的方法来实现我想要的结果?

1 个答案:

答案 0 :(得分:3)

这是你想要的吗?

select k,
       sum(tm) as tm,
       sum(case when ts1 > '2012-01-01' then tm else 0 end) as tm_20120101
from foo.a
group by k