如何基于app_code和year生成Flag字段?求SQL实现方案
需求实现说明
原数据表
| ID | org_id | app_code | year |
|---|---|---|---|
| 1 | 205 | EBB | 2016 |
| 2 | 205 | EBB | 2016 |
| 3 | 205 | LF | 2017 |
| 4 | 205 | LF | 2017 |
| 5 | 205 | LF | 2018 |
| 6 | 205 | LF | 2018 |
| 7 | 205 | LF | 2019 |
| 8 | 205 | LF | 2019 |
| 9 | 205 | EBB | 2020 |
| 10 | 205 | EBB | 2020 |
| 11 | 205 | LF | 2020 |
| 12 | 205 | LF | 2020 |
| 13 | 205 | EBB | 2021 |
| 14 | 205 | EBB | 2021 |
| 15 | 205 | LF | 2021 |
| 16 | 205 | LF | 2021 |
| 17 | 205 | LF | 2022 |
| 18 | 205 | LF | 2022 |
| 19 | 205 | EBB | 2022 |
| 20 | 205 | EBB | 2022 |
预期输出表
| ID | org_id | app_code | year | Flag |
|---|---|---|---|---|
| 1 | 205 | EBB | 2016 | 2 |
| 2 | 205 | EBB | 2016 | 2 |
| 3 | 205 | LF | 2017 | 1 |
| 4 | 205 | LF | 2017 | 1 |
| 5 | 205 | LF | 2018 | 1 |
| 6 | 205 | LF | 2018 | 1 |
| 7 | 205 | LF | 2019 | 1 |
| 8 | 205 | LF | 2019 | 1 |
| 9 | 205 | EBB | 2020 | 3 |
| 10 | 205 | EBB | 2020 | 3 |
| 11 | 205 | LF | 2020 | 3 |
| 12 | 205 | LF | 2020 | 3 |
| 13 | 205 | EBB | 2021 | 3 |
| 14 | 205 | EBB | 2021 | 3 |
| 15 | 205 | LF | 2021 | 3 |
| 16 | 205 | LF | 2021 | 3 |
| 17 | 205 | LF | 2022 | 3 |
| 18 | 205 | LF | 2022 | 3 |
| 19 | 205 | EBB | 2022 | 3 |
| 20 | 205 | EBB | 2022 | 3 |
规则说明
- 若某一年的所有app_code均为LF,则Flag为1;
- 若某一年的所有app_code均为EBB,则Flag为2;
- 若某一年同时存在LF和EBB两种app_code,则Flag为3。
SQL实现语句
方法一:使用窗口函数(无需子查询)
SELECT ID, org_id, app_code, year, CASE -- 当年仅存在LF类型 WHEN COUNT(DISTINCT app_code) OVER (PARTITION BY year) = 1 AND MAX(app_code) OVER (PARTITION BY year) = 'LF' THEN 1 -- 当年仅存在EBB类型 WHEN COUNT(DISTINCT app_code) OVER (PARTITION BY year) = 1 AND MAX(app_code) OVER (PARTITION BY year) = 'EBB' THEN 2 -- 当年同时存在两种类型 ELSE 3 END AS Flag FROM your_table_name;
方法二:使用子查询统计年度信息后关联
WITH year_app_stats AS ( SELECT year, COUNT(DISTINCT app_code) AS distinct_app_count, MAX(app_code) AS dominant_app FROM your_table_name GROUP BY year ) SELECT t.ID, t.org_id, t.app_code, t.year, CASE WHEN s.distinct_app_count = 1 AND s.dominant_app = 'LF' THEN 1 WHEN s.distinct_app_count = 1 AND s.dominant_app = 'EBB' THEN 2 ELSE 3 END AS Flag FROM your_table_name t JOIN year_app_stats s ON t.year = s.year;
注:请将
your_table_name替换为实际的表名。
内容的提问来源于stack exchange,提问作者Sri Harsha
相关产品推荐
相关产品推荐

