Oracle PIVOT
能行得通:
with test_data (item_no, shipping_date, last_updated) as (
SELECT 100, to_date( '01-Sep-16','DD-MON-YY'), to_date('24-Aug-16','DD-MON-YY') FROM DUAL UNION ALL
SELECT 101, to_date( '10-Sep-16','DD-MON-YY'), to_date('24-Aug-16','DD-MON-YY') FROM DUAL UNION ALL
SELECT 102, to_date( '31-Aug-16','DD-MON-YY'), to_date('24-Aug-16','DD-MON-YY') FROM DUAL UNION ALL
SELECT 101, to_date( '11-Sep-16','DD-MON-YY'), to_date('25-Aug-16','DD-MON-YY') FROM DUAL UNION ALL
SELECT 101, to_date( '12-Sep-16','DD-MON-YY'), to_date('26-Aug-16','DD-MON-YY') FROM DUAL UNION ALL
SELECT 100, to_date( '31-Aug-16','DD-MON-YY'), to_date('27-Aug-16','DD-MON-YY') FROM DUAL UNION ALL
SELECT 102, to_date( '01-Sep-16','DD-MON-YY'), to_date('27-Aug-16','DD-MON-YY') FROM DUAL UNION ALL
SELECT 103, to_date( '01-Oct-16','DD-MON-YY'), to_date('27-Aug-16','DD-MON-YY') FROM DUAL
)SELECT item_no,
event_1_shipping,
event_1_last_updated,
event_2_shipping,
event_2_last_updated,
event_3_shipping,
event_3_last_updated
FROM (SELECT last_3.item_no,
last_3.shipping_date,
last_3.last_updated,
ROW_NUMBER () OVER (PARTITION BY item_no ORDER BY filter_rown DESC) rown
FROM (SELECT td.*,
ROW_NUMBER () OVER (PARTITION BY item_no ORDER BY last_updated DESC) filter_rown
FROM test_data td) last_3
WHERE filter_rown <= 3) PIVOT (MIN (shipping_date) "SHIPPING", MIN (last_updated) "LAST_UPDATED"
FOR rown
IN (1 AS "EVENT_1", 2 AS "EVENT_2", 3 AS "EVENT_3"))
*** 根据我的原始答案进行编辑,以允许事件从最早到最新排序。