この質問は私の前の質問とよく似ていますが、もう少し複雑です。 Rob van Wijk の回答は、私の他の質問に対して完全に機能し、それを出発点として使用してきました。私の問題は、さまざまなフィールドの日付をピボットしていることです。以前は、与えられた の allopen_in
と のopen_out
値を取得することに関心がありましたがid
、今はnew_in
, new_out
, open_in
, open_out
,fixed_in
とfixed_out
for each が必要id
です。私は次のものを持っています:
SELECT id,
state,
state_time,
MAX(new_row_num) OVER (PARTITION BY id ORDER BY state_time) AS new_row_group,
MAX(open_row_num) OVER (PARTITION BY id ORDER BY state_time) AS open_row_group,
MAX(fixed_row_num) OVER (PARTITION BY id ORDER BY state_time) AS fixed_row_group
FROM (
SELECT id,
state,
state_time,
CASE state
WHEN 'New'
THEN ROW_NUMBER() OVER (PARTITION BY id ORDER BY state_time)
END AS new_row_num,
CASE state
WHEN 'Open'
THEN ROW_NUMBER() OVER (PARTITION BY id ORDER BY state_time)
END AS open_row_num,
CASE state
WHEN 'Fixed'
THEN ROW_NUMBER() OVER (PARTITION BY id ORDER BY state_time)
END AS fixed_row_num
FROM ...
)
これにより、次のようなデータが得られます。
id state state_time new_row_group open_row_group fixed_row_group
1 New 2009-03-03 00:03:31 1
1 Closed 2009-03-04 04:15:27 1
2 New 2010-05-22 14:38:49 1
2 Open 2010-05-22 14:39:14 1 2
2 Fixed 2010-05-22 17:15:27 1 2 3
以下のようなデータが欲しいです。
id new_in new_out open_in open_out fixed_in fixed_out
1 2009-03-03 00:03:31 2009-03-04 04:15:27
2 2010-05-22 14:38:49 2010-05-22 14:39:14 2010-05-22 14:39:14 2010-05-22 17:15:27 2010-05-22 17:15:27
データをピボットして、それぞれのこの日付ペアを取得するにはどうすればよいid
ですか?
編集: 明確にするためにid
、状態に複数回出入りできます。たとえば、id
新規からオープン、修正済み、オープン、修正済み、クローズドに進む場合があります。その場合、すべての状態時間を保持するのに必要な数の行が必要になります。たとえば、次のようになります。
id new_in new_out open_in open_out fixed_in fixed_out
4 2009-01-01 00:00:00 2009-01-02 00:00:00 2009-01-02 00:00:00 2009-01-03 00:00:00 2009-01-03 00:00:00 2009-01-04 00:00:00
4 2009-01-04 00:00:00 2009-01-05 00:00:00 2009-01-05 00:00:00 2009-01-06 00:00:00