4

次のクエリがあります。

WITH t as (
  SELECT date_trunc('hour', time_series) as trunc 
  FROM generate_series('2013-02-27 22:00'::timestamp, '2013-02-28 2:00', 
                       '1 hour') as time_series
  GROUP BY trunc
  ORDER BY trunc
)
SELECT DISTINCT ON(trunc) trunc, id
FROM t
LEFT JOIN (
   SELECT id, created, date_trunc('hour', created) as trunc_u
   FROM event
   ORDER BY created DESC
) u
ON trunc = trunc_u

次の結果が得られます。

"2013-02-27 22:00:00";
"2013-02-27 23:00:00";2
"2013-02-28 00:00:00";5
"2013-02-28 01:00:00";
"2013-02-28 02:00:00";

テーブルeventにはidcreatedおよび他のいくつかの列がありますが、ここで関連するのはそれらだけです。上記のクエリはid、特定の期間ごとに生成された最後のイベントを提供します (期間ごとに適切な集計が得られたtruncおかげです)。DISTINCT ON

現在、このクエリはNULL、特定の期間にイベントが発生しなかった場合に生成されます。id期間が異なっていても、以前の available を返したいと思います。すなわち:

"2013-02-27 22:00:00";0
"2013-02-27 23:00:00";2
"2013-02-28 00:00:00";5
"2013-02-28 01:00:00";5
"2013-02-28 02:00:00";5

これを達成するための簡単な方法が欠けていると確信しています。何かアドバイス?

4

2 に答える 2

4

自己結合とWindows 関数を混在させることができます

簡単にするために、このサンプル値を使用してこの表を取得します。

create table t ( a int, b int);    
insert into t values 
( 1, 1),
( 2, Null),
( 3, Null),
( 4, 2 ),
( 5, Null),
( 6, Null);

あなたのクエリにatrunc_ubあなたのid. クエリは次のとおりです。

with cte as (    
    select 
      t1.a, 
      coalesce( t1.b, t2.b, 0) as b,
      rank() OVER 
       (PARTITION BY t1.a ORDER BY t2.a DESC) as pos
    from t t1 
    left outer join t t2
      on t2.b is not null and
         t2.a < t1.a    
)
select a, b
from cte
where pos = 1;

そして結果

| A | B |
---------
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 2 |
| 6 | 2 |
于 2013-02-28T20:45:26.423 に答える
3

試す:

WITH t as (
  SELECT time_series as trunc 
    FROM generate_series('2013-02-27 22:00'::timestamp, '2013-02-28 2:00', 
                         '1 hour') as time_series
)
SELECT DISTINCT ON(t.trunc) t.trunc, e.id
  FROM t
  JOIN event e
    ON e.created < t.trunc 
 ORDER BY t.trunc, e.created DESC

遅すぎる場合は教えてください。より高速なクエリを提供します。

于 2013-02-28T20:45:30.590 に答える