ORACLE:基于行和事务使用哪条语句,保持这种方式

ktecyv1j  于 2022-12-26  发布在  Oracle
关注(0)|答案(3)|浏览(98)

我被困在这一点上,很难解释写在这里,以及主题标题希望通过数据示例和输出结果下面,足以给你一个想法。
我不知道该用哪条Oracle SQL语句。over(分区)似乎不适用于下面的场景。
screenshoot - before & after

    • 数据**

| 客户标识|行标识|日期|类型|
| - ------| - ------| - ------| - ------|
| 兰博01|二十二|2022年3月14日|汽车1|
| 兰博01|二十一|2022年3月11日|汽车1|
| 兰博01|二十个|二零零一年十一月九日|汽车1|
| 兰博01|十九|二零零一年十月十六日|汽车1|
| 兰博01|十八|二○ ○一年八月十日|CAR 2|
| 兰博01|十七|二零零一年五月二十九日|CAR 2|
| 兰博01|十六|二零零一年四月二十四日|CAR 2|
| 兰博01|十五|二零零一年三月十三日|CAR 3|
| 兰博01|十四|二○ ○ ○年十二月二十一日|CAR 3|
| 兰博01|十三|二○ ○ ○年十一月十三日|CAR 3|
| 兰博01|十二|二○ ○ ○年十月二十日|CAR 3|
| 兰博01|十一|二○ ○ ○年三月十四日|汽车1|
| 兰博01|十个|二○ ○ ○年一月十八日|汽车1|
| 兰博01|九|一九九九年十二月二十四日|CAR 2|
| 兰博01|八个|一九九九年九月十四日|CAR 2|
| 兰博01|七|一九九九年三月三十日|CAR 2|
| 兰博01|六个|一九九九年二月二十四日|CAR 2|
| 兰博01|五个|一九九九年二月十九日|CAR 4|
| 兰博01|四个|一九九八年十二月十五日|CAR 4|
| 兰博01|三个|一九九八年十二月十五日|CAR 4|
| 兰博01|第二章|一九九八年九月二十四日|CAR 4|
| 兰博01| 1个|一九九八年八月六日|CAR 4|
我想要的输出结果如下:
| 客户标识|类型|最小日期|最大日期|
| - ------| - ------| - ------| - ------|
| 兰博01|车1|二零零一年十月十六日|二○ ○二年三月十四日|
| 兰博01| 2号车|二零零一年四月二十四日|二○ ○一年八月十日|
| 兰博01|三号车|二○ ○ ○年十月二十日|二零零一年三月十三日|
| 兰博01|车1|二○ ○ ○年一月十八日|二○ ○ ○年三月十四日|
| 兰博01| 2号车|一九九九年二月二十四日|一九九九年十二月二十四日|
| 兰博01| 4号车|一九九八年八月六日|一九九九年二月十九日|
我希望这些对你有意义,希望你能在这方面帮助我。
非常感谢

2uluyalo

2uluyalo1#

您必须首先应用Tabibitosan算法:

select customer_id, type, rn, min(dat) as min_date, max(dat) as max_dat
from (
    select d.*, row_id+1-row_number() over(partition by customer_id, type order by row_id) as rn 
    from data d
)
group by customer_id, type, rn
order by customer_id, type
;

CUST TYPE          RN MIN_DATE MAX_DAT 
---- ----- ---------- -------- --------
LB01 CAR 1         10 18/01/00 14/03/00
LB01 CAR 1         17 16/10/01 14/03/22
LB01 CAR 2          6 24/02/99 24/12/99
LB01 CAR 2         12 24/04/01 10/08/01
LB01 CAR 3         12 20/10/00 13/03/01
LB01 CAR 4          1 06/08/98 19/02/99
0yg35tkg

0yg35tkg2#

参考@p3consulting关于Tabibitosan算法的上述帖子
下面是您可以复制并粘贴到Oracle SQL中的脚本
我的问题在这里仍然不工作,我的数据,仍然搜索正确的脚本

with
sample_data (customer_id, row_id, mock_date, product_type) as (
select 'LB01', '22', to_date ('03/14/22', 'mm/dd/rr'), 'CAR 1' from dual union all    
select 'LB01', '21', to_date ('03/11/22', 'mm/dd/rr'), 'CAR 1' from dual union all
select 'LB01', '20', to_date ('11/09/01', 'mm/dd/rr'), 'CAR 1' from dual union all
select 'LB01', '19', to_date ('10/16/01', 'mm/dd/rr'), 'CAR 1' from dual union all
select 'LB01', '18', to_date ('08/10/01', 'mm/dd/rr'), 'CAR 2' from dual union all
select 'LB01', '17', to_date ('05/29/01', 'mm/dd/rr'), 'CAR 2' from dual union all
select 'LB01', '16', to_date ('04/24/01', 'mm/dd/rr'), 'CAR 2' from dual union all
select 'LB01', '15', to_date ('03/13/01', 'mm/dd/rr'), 'CAR 3' from dual union all    
select 'LB01', '14', to_date ('12/21/00', 'mm/dd/rr'), 'CAR 3' from dual union all
select 'LB01', '13', to_date ('11/13/00', 'mm/dd/rr'), 'CAR 3' from dual union all
select 'LB01', '12', to_date ('10/20/00', 'mm/dd/rr'), 'CAR 3' from dual union all
select 'LB01', '11', to_date ('03/14/00', 'mm/dd/rr'), 'CAR 1' from dual union all
select 'LB01', '10', to_date ('01/18/00', 'mm/dd/rr'), 'CAR 1' from dual union all
select 'LB01', '09', to_date ('12/24/99', 'mm/dd/rr'), 'CAR 2' from dual union all
select 'LB01', '08', to_date ('09/14/99', 'mm/dd/rr'), 'CAR 2' from dual union all
select 'LB01', '07', to_date ('03/30/99', 'mm/dd/rr'), 'CAR 2' from dual union all
select 'LB01', '06', to_date ('02/24/99', 'mm/dd/rr'), 'CAR 2' from dual union all
select 'LB01', '05', to_date ('02/19/99', 'mm/dd/rr'), 'CAR 4' from dual union all    
select 'LB01', '04', to_date ('12/15/98', 'mm/dd/rr'), 'CAR 4' from dual union all    
select 'LB01', '03', to_date ('12/15/98', 'mm/dd/rr'), 'CAR 4' from dual union all
select 'LB01', '02', to_date ('09/24/98', 'mm/dd/rr'), 'CAR 4' from dual union all
select 'LB01', '01', to_date ('06/08/98', 'mm/dd/rr'), 'CAR 4' from dual 
)
 
select
customer_id ,
product_type ,
grp ,
min(mock_date) as min_date , 
max(mock_date) as max_date 
from (
select d.* ,
row_id + 1 - row_number () over (partition by customer_id, product_type order by row_id) as grp
from sample_data d )
 
group by
customer_id ,
product_type ,
grp 
 
order by
grp desc

尽情享受吧!

jtoj6r0c

jtoj6r0c3#

只需根据现有ROW_ID创建自己的分组计算,并使用MIN_DATE进行排序:

SELECT  CUST_ID, A_TYPE, Min(A_DATE) "MIN_DATE", Max(A_DATE) "MAX_DATE" 
FROM    (SELECT     t.*,
                    Max(ROW_ID) OVER(Partition By CUST_ID || A_TYPE ORDER BY ROW_ID DESC Rows Between Unbounded Preceding And Current Row) -
                    (ROW_ID + Sum(1) OVER(PARTITION BY CUST_ID || A_TYPE ORDER BY ROW_ID DESC) - 1) "GRP"
        FROM        tbl t
        ORDER BY    ROW_ID DESC     )
GROUP BY    CUST_ID, A_TYPE, GRP
ORDER BY    CUST_ID, MIN(A_DATE) DESC

使用示例数据:

WITH
    tbl (CUST_ID,   ROW_ID, A_DATE, A_TYPE) AS
        (   Select 'LB01',  22, To_Date('14/03/2022', 'dd/mm/yyyy'),    'CAR 1' From Dual Union All
            Select 'LB01',  21, To_Date('11/03/2022', 'dd/mm/yyyy'),    'CAR 1' From Dual Union All
            Select 'LB01',  20, To_Date('09/11/2001', 'dd/mm/yyyy'),    'CAR 1' From Dual Union All
            Select 'LB01',  19, To_Date('16/10/2001', 'dd/mm/yyyy'),    'CAR 1' From Dual Union All
            --
            Select 'LB01',  18, To_Date('10/08/2001', 'dd/mm/yyyy'),    'CAR 2' From Dual Union All
            Select 'LB01',  17, To_Date('29/05/2001', 'dd/mm/yyyy'),    'CAR 2' From Dual Union All
            Select 'LB01',  16, To_Date('24/04/2001', 'dd/mm/yyyy'),    'CAR 2' From Dual Union All
            --
            Select 'LB01',  15, To_Date('13/03/2001', 'dd/mm/yyyy'),    'CAR 3' From Dual Union All
            Select 'LB01',  14, To_Date('21/12/2000', 'dd/mm/yyyy'),    'CAR 3' From Dual Union All
            Select 'LB01',  13, To_Date('13/11/2000', 'dd/mm/yyyy'),    'CAR 3' From Dual Union All
            Select 'LB01',  12, To_Date('20/10/2000', 'dd/mm/yyyy'),    'CAR 3' From Dual Union All
            --
            Select 'LB01',  11, To_Date('14/03/2000', 'dd/mm/yyyy'),    'CAR 1' From Dual Union All
            Select 'LB01',  10, To_Date('18/01/2000', 'dd/mm/yyyy'),    'CAR 1' From Dual Union All
            --
            Select 'LB01',  9,  To_Date('24/12/1999', 'dd/mm/yyyy'),    'CAR 2' From Dual Union All
            Select 'LB01',  8,  To_Date('14/09/1999', 'dd/mm/yyyy'),    'CAR 2' From Dual Union All
            Select 'LB01',  7,  To_Date('30/03/1999', 'dd/mm/yyyy'),    'CAR 2' From Dual Union All
            Select 'LB01',  6,  To_Date('24/02/1999', 'dd/mm/yyyy'),    'CAR 2' From Dual Union All
            --
            Select 'LB01',  5,  To_Date('19/02/1999', 'dd/mm/yyyy'),    'CAR 4' From Dual Union All
            Select 'LB01',  4,  To_Date('15/12/1998', 'dd/mm/yyyy'),    'CAR 4' From Dual Union All
            Select 'LB01',  3,  To_Date('15/12/1998', 'dd/mm/yyyy'),    'CAR 4' From Dual Union All
            Select 'LB01',  2,  To_Date('24/09/1998', 'dd/mm/yyyy'),    'CAR 4' From Dual Union All
            Select 'LB01',  1,  To_Date('06/08/1998', 'dd/mm/yyyy'),    'CAR 4' From Dual
        )

结果:
| 客户标识|A_类型|最小日期|最大日期|
| - ------| - ------| - ------| - ------|
| 兰博01|汽车1| 2001年10月16日|二十二年三月十四日|
| 兰博01| CAR 2| 2001年4月24日|2001年8月10日|
| 兰博01| CAR 3| 2000年10月20日|2001年3月13日|
| 兰博01|汽车1| 2000年1月18日|2000年3月14日|
| 兰博01| CAR 2|一九九九年二月二十四日|一九九九年十二月二十四日|
| 兰博01| CAR 4|一九九八年八月六日|一九九九年二月十九日|

相关问题