oracle sql 中的累计总计

问题描述 投票:0回答:1

我有下表

CP          ROK DOPIS_C
6059150790  2014    C
6059150790  2015    C
6059150790  2016    C
6059150790  2017     
6059150790  2018    C
6059150790  2019     
6059150790  2020    C
6059150790  2021    C
6059150790  2022    C
6059150790  2023     
6059150790  2024     

我需要这个输出

CP          ROK DOPIS_C     RN_C1
6059150790  2014    C         1
6059150790  2015    C         2
6059150790  2016    C         3
6059150790  2017                 
6059150790  2018    C         1
6059150790  2019                 
6059150790  2020    C         1
6059150790  2021    C         2
6059150790  2022    C         3
6059150790  2023             
6059150790  2024                 

在 RN_C1 列中,对先前记录的数量进行计数,其中 DOPIS_C 的值为 C,如果 DOPIS_C 列中的先前记录中有空值,则重置计数器

我试试这个

SELECT 
    CP,
    ROK,
    DOPIS_C,
    CASE 
        WHEN DOPIS_C = 'C' THEN 
            CASE 
                WHEN lag(DOPIS_C) OVER (ORDER BY ROK) IS NULL THEN 
                    ROW_NUMBER() OVER (ORDER BY ROK)
                WHEN lag(DOPIS_C) OVER (ORDER BY ROK) = 'C' THEN 
                    COUNT(CASE WHEN DOPIS_C = 'C' THEN 1 END) OVER (ORDER BY ROK) 
            END
        ELSE 0 
    END AS POSILANI
FROM 
    table;

但结果是

6059150790  2014    C   1
6059150790  2015    C   2
6059150790  2016    C   3
6059150790  2017        0
6059150790  2018    C   5
6059150790  2019        0
6059150790  2020    C   7
6059150790  2021    C   6
6059150790  2022    C   7
6059150790  2023        0
6059150790  2024        0
sql oracle
1个回答
0
投票

从 Oracle 12 开始,您可以使用

MATCH_RECOGNIZE
进行逐行模式匹配:

SELECT cp,
       rok,
       dopis_c,
       CASE dopis_c WHEN 'C' THEN posilani END AS posilani
FROM   table_name
       MATCH_RECOGNIZE(
         PARTITION BY cp
         ORDER BY rok
         MEASURES
           COUNT(dopis_c) AS posilani
         ALL ROWS PER MATCH
         PATTERN ( C+ | NOT_C )
         DEFINE C AS dopis_c = 'C'
       );

对于样本数据:

CREATE TABLE table_name (CP, ROK, DOPIS_C) AS
SELECT 6059150790, 2014, 'C'  FROM DUAL UNION ALL
SELECT 6059150790, 2015, 'C'  FROM DUAL UNION ALL
SELECT 6059150790, 2016, 'C'  FROM DUAL UNION ALL
SELECT 6059150790, 2017, NULL FROM DUAL UNION ALL
SELECT 6059150790, 2018, 'C'  FROM DUAL UNION ALL
SELECT 6059150790, 2019, NULL FROM DUAL UNION ALL
SELECT 6059150790, 2020, 'C'  FROM DUAL UNION ALL
SELECT 6059150790, 2021, 'C'  FROM DUAL UNION ALL
SELECT 6059150790, 2022, 'C'  FROM DUAL UNION ALL
SELECT 6059150790, 2023, NULL FROM DUAL UNION ALL
SELECT 6059150790, 2024, NULL FROM DUAL;

输出:

CP 韩国 DOPIS_C 波西拉尼
6059150790 2014 C 1
6059150790 2015 C 2
6059150790 2016 C 3
6059150790 2017
6059150790 2018 C 1
6059150790 2019
6059150790 2020 C 1
6059150790 2021 C 2
6059150790 2022 C 3
6059150790 2023
6059150790 2024

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.