SQL脚本实现:按日期优先保留指定Lkup_Value值
实现指定逻辑的SQL脚本方案
需求说明
对包含Lkup_Value和Report_Date字段的数据库表,执行以下处理逻辑:
- 当同一
Report_Date下存在Lkup_Value为MMM的记录时,该日期下所有记录的Lkup_Value统一替换为MMM - 若该日期无
MMM记录,则保留原有Lkup_Value值
原表数据
Lkup_Value | Report_Date -------------------+------------------------------ MMM |2022-07-11 MMM-IR |2022-07-11 MMM-IR |2022-07-04 MMM |2022-07-04 CCC |2022-01-26 CCC |2022-01-03
期望输出
Lkup_Value | Report_Date -------------------+------------------------------ MMM |2022-07-11 MMM |2022-07-11 MMM |2022-07-04 MMM |2022-07-04 CCC |2022-01-26 CCC |2022-01-03
解决方案
方案1:子查询结合CASE WHEN
逻辑直观,适合小数据量场景:
SELECT CASE WHEN EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.Report_Date = t1.Report_Date AND t2.Lkup_Value = 'MMM' ) THEN 'MMM' ELSE t1.Lkup_Value END AS Lkup_Value, t1.Report_Date FROM your_table t1;
方案2:窗口函数实现(性能更优)
仅扫描表一次,适合大数据量场景:
SELECT CASE WHEN has_mmm = 1 THEN 'MMM' ELSE Lkup_Value END AS Lkup_Value, Report_Date FROM ( SELECT Lkup_Value, Report_Date, MAX(CASE WHEN Lkup_Value = 'MMM' THEN 1 ELSE 0 END) OVER (PARTITION BY Report_Date) AS has_mmm FROM your_table ) t;
说明
- 将脚本中的
your_table替换为你的实际表名 - 方案2通过窗口函数给每个日期标记是否存在
MMM记录,外层根据标记统一替换值,执行效率远高于方案1
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

