我遇到查询问题,我正在使用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次。
我的问题:是否有解决方法来对未分组的列执行相关查询?如果不是,那么达成我想要的结果的更好方法是什么?
检查查询计划。视图被处理,就好像它们在被引入查询之前一样。这将(在大多数情况下)导致出色的计划。 – wildplasser