我遇到了查询问题,我正在使用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次。
我的问题:是否有解决方法在未组合列上执行相关查询?如果没有,有什么更好的方法来实现我想要的结果?
答案 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