2012-12-07 31 views
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 

我有我的结果约8000行。现在,我要总结的时间间隔的和group by关键,所以我这样做:

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 BY 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次。

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

+0

检查查询计划。视图被处理,就好像它们在被引入查询之前一样。这将(在大多数情况下)导致出色的计划。 – wildplasser

回答

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 
+0

你明白了。我甚至没有想到在sum()中使用case。非常感谢! – fbynite