【发布时间】:2010-06-23 13:53:31
【问题描述】:
这个问题很像my previous question,但是稍微复杂一些。 Rob van Wijk's answer 完美解决了我的另一个问题,我一直以此为起点。我现在的问题是我正在为不同的字段旋转日期。在我关心获取给定id 的所有open_in 和open_out 值之前,现在我想要new_in、new_out、open_in、open_out、fixed_in 和fixed_out每个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 可能从 New 到 Open 到 Fixed 到 Open 到 Fixed 到 Closed。在这种情况下,需要有尽可能多的行来保存所有状态时间,例如:
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
【问题讨论】:
标签: oracle select plsql pivot-table analytic-functions