oracle基于父/子分区获取最新值

eimct9ow  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(311)

我有一个名为“customer”的表,如下所示:

ID      ALPHA      BRAVO    CHARLIE          DATE
-------------------------------------------------
 1        111        222        333    02/02/2019
 2        333        444        555    11/11/2019
 3        666        555        777    12/12/2019
 4        777        888        999    05/05/2020
 5        100        101        110    12/25/2020

我需要得到以下输出:

ID      ALPHA      BRAVO    CHARLIE          DATE     NEW_COL   ROW_NUM
-----------------------------------------------------------------------
 1        111        222        333    02/02/2019        333          4
 2        333        444        555    11/11/2019        333          3
 3        666        555        777    12/12/2019        333          2   
 4        777        888        999    05/05/2020        333          1
 5        100        101        110    12/25/2020        010          1

alpha、bravo和charlie列表示客户id。给定的客户在系统中可以有多个ID。记录1-4表示属于同一个客户的id,比如john。根据表格,约翰有12个身份证,他的最新身份证是999。记录5代表另一个顾客,比如说简。简有三个身份证,最后一个身份证是110。
row_num列的目的是获取最后一个customer.charlie值。其思想是使用第一个charlie值作为分区。基本上,目标是得到一个parent:many children Map。在这种情况下,id 333应该绑定到555、777和999。
以下是ddl/dml:

CREATE TABLE CUSTOMER
(ID NUMBER(20) NOT NULL,
 ALPHA NUMBER(20) NOT NULL,
 BRAVO NUMBER(20) NOT NULL,
 CHARLIE NUMBER(20) NOT NULL,
 CREATEDDATE DATE
 );

INSERT INTO CUSTOMER
VALUES
(1, 111, 222, 333, to_date('02-FEB-19','DD-MON-RR'));

INSERT INTO CUSTOMER
VALUES
(2, 333, 444, 555, to_date('11-NOV-19','DD-MON-RR'));

INSERT INTO CUSTOMER
VALUES
(3, 666, 555, 777, to_date('12-DEC-19','DD-MON-RR'));

INSERT INTO CUSTOMER
VALUES
(4, 777, 888, 999, to_date('05-MAY-20','DD-MON-RR'));

INSERT INTO CUSTOMER
VALUES
(5, 100, 101, 110, to_date('25-DEC-20','DD-MON-RR'));

COMMIT;

我尝试了以下查询,但未能正确填充分区列:

WITH
   charlies
   AS
      (SELECT DISTINCT charlie
       FROM customer),
   mult_customers
   AS
      (SELECT c.*, c.charlie AS NEW_COL
       FROM customer c
       UNION
       SELECT c.*,
              CASE WHEN c.alpha = e.charlie THEN c.alpha ELSE c.bravo END AS NEW_COL
       FROM customer c
            JOIN charlies e ON e.charlie = c.alpha OR e.charlie = c.bravo),
   ranked
   AS
      (SELECT mc.*,
              ROW_NUMBER ()
                 OVER (PARTITION BY NEW_COL ORDER BY createddate DESC) AS row_num
       FROM mult_customers mc)
SELECT *
FROM ranked
ORDER BY ID;

谢谢你的帮助。

r1zk6ea1

r1zk6ea11#

您的任务称为连接组件。我在7-8年前写过这个甚至pl/sql包的解决方案:http://orasql.org/2017/09/29/connected-components/
此pl/sql解决方案比纯sql解决方案更有效:http://orasql.org/2014/02/28/straight-sql-vs-sql-and-plsql/
让我知道如果你需要在你的任务中采用它的帮助。

相关问题