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

さらに一歩進んで、これを実行したいと思います (エラー - ERROR: subquery uses ungrouped column 'ts1' from outside query)。

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 をグループ句に追加すると、当然、目的の結果が返されません。これは、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 に答える