Oracle 将行数据作为指定数量的唯一条目的列返回

2023-12-24

我有一个 Oracle 表,它按项目编号标识符充当项目的活动日志/更改跟踪器。我想获取最后三个更改并以列格式列出它们。

样本数据

Item_No   Shipping_date     Last_updated
100       01-Sep-16         24-Aug-16
101       10-Sep-16         24-Aug-16
102       31-Aug-16         24-Aug-16
101       11-Sep-16         25-Aug-16
101       12-Sep-16         26-Aug-16
100       31-Aug-16         27-Aug-16
102       01-Sep-16         27-Aug-16
103       01-Oct-16         27-Aug-16

Expected output would be:
Item_No Shipping_1  Updated_1  Shipping_2  Updated_2  Shipping_3  Updated_3
100     01-Sep-16   24-Aug-16  31-Aug-16   27-Aug-16
101     10-Sep-16   24-Aug-16  11-Sep-16   25-Aug-16  12-Sep-16   26-Aug-16
102     31-Aug-16   24-Aug-16  01-Sep-16   27-Aug-16
103     01-Oct-16   27-Aug-16

有人有主意吗?我已经搞乱了 PIVOT、DECODE,但我似乎无法让任何东西发挥作用。我最接近的是:

SELECT
  ITEM_NO,
  LISTAGG(TO_CHAR(Shipping_date, 'DD-MON-YY') || ' ' || TO_CHAR(Last_updated, 'DD-MON-YY'))
  WITHIN GROUP
  (ORDER BY Last_updated) Shipping_date
FROM SHIPPING_DETAIL
GROUP BY Item_No
HAVING COUNT(*) > 1

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"))

*** 根据我的原始答案进行编辑,以允许事件从最早到最新排序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle 将行数据作为指定数量的唯一条目的列返回 的相关文章

随机推荐