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