我有下表
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
从 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 | 空 | 空 |