0

我在查询时遇到问题,我使用的是 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 次。

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

4

1 回答 1

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
于 2012-12-07T22:19:22.680 回答