次の Oracle クエリがあります。
SELECT id,
DECODE(state, 'Open', state_in, NULL) AS open_in,
DECODE(state, 'Not Open', state_in, NULL) AS open_out,
FROM (
SELECT id,
CASE WHEN state = 'Open'
THEN 'Open'
ELSE 'Not Open'
END AS state,
TRUNC(state_time) AS state_in
FROM ...
)
これにより、次のようなデータが得られます。
id open_in open_out
1 2009-03-02 00:00:00
1 2009-03-05 00:00:00
1 2009-03-11 00:00:00
1 2009-03-26 00:00:00
1 2009-03-24 00:00:00
1 2009-04-13 00:00:00
私が欲しいのは次のようなデータです:
id open_in open_out
1 2009-03-02 00:00:00 2009-03-05 00:00:00
1 2009-03-11 00:00:00 2009-03-24 00:00:00
つまり、id
/のすべての一意のペアを保持しopen_in
、open_out
それに続くopen_in
. 特定の に対して任意の数の一意の値が存在する可能性があり、任意の数の一意の値open_in
が存在する可能性があります。一意の/に一致する値がない可能性があります。その場合は、その行に対応する必要があります。id
open_out
id
open_in
open_out
open_out
null
LAG
ここでは、おそらくまたはという分析関数LEAD
が役立つと思います。おそらく私はMIN
で使用する必要がありPARTITION
ます。