如何按日期获取表中首个非空值?CASE表达式实现遇阻
解决按日期获取分组内首个非空值的SQL实现问题
问题分析
你当前的写法存在两个核心问题:
- CASE表达式不能直接写在
LEFT OUTER JOIN ... ON子句之后,这不符合SQL语法规范; - 要获取同一common_id下按日期排序的首个非空column_1值,需要基于分组的窗口函数或子查询预处理数据,单条记录的CASE逻辑无法跨行获取分组内的全局信息。
可行解决方案
以下两种方案均可实现需求,你可以根据实际场景选择:
方案一:使用FIRST_VALUE窗口函数预处理数据
先通过窗口函数为每个common_id计算出最早日期对应的非空column_1值,再关联表T2进行逻辑判断:
WITH processed_table1 AS ( SELECT common_id, column_1, -- 替换为你实际的日期列名 date_column, -- 按common_id分组,按日期升序取首个非空的column_1 FIRST_VALUE(column_1) OVER ( PARTITION BY common_id ORDER BY date_column ASC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) AS first_non_null_col1 FROM table_1 ) SELECT T2.*, CASE WHEN PT1.column_1 IS NOT NULL THEN PT1.column_1 WHEN PT1.first_non_null_col1 IS NOT NULL THEN PT1.first_non_null_col1 ELSE 0 END AS target_value FROM table_2 T2 LEFT JOIN processed_table1 PT1 ON T2.common_id = PT1.common_id;
关键说明:
PARTITION BY common_id:确保只在同一个common_id的范围内计算;ORDER BY date_column ASC:指定按日期从早到晚排序,保证取到最早的非空值;- 窗口范围
UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING:确保即使当前行在分组中位置靠后,也能取到分组内最早的非空值。
方案二:使用ROW_NUMBER()子查询定位首个非空行
先筛选出每个common_id下最早的非空column_1记录,再关联原始表和T2进行逻辑判断:
WITH first_non_null_records AS ( SELECT common_id, column_1 AS first_non_null_col1 FROM ( SELECT common_id, column_1, -- 替换为你实际的日期列名 date_column, ROW_NUMBER() OVER ( PARTITION BY common_id ORDER BY date_column ASC ) AS row_num FROM table_1 WHERE column_1 IS NOT NULL ) sub_query WHERE row_num = 1 ) SELECT T2.*, CASE WHEN T1.column_1 IS NOT NULL THEN T1.column_1 WHEN FNN.first_non_null_col1 IS NOT NULL THEN FNN.first_non_null_col1 ELSE 0 END AS target_value FROM table_2 T2 LEFT JOIN table_1 T1 ON T2.common_id = T1.common_id LEFT JOIN first_non_null_records FNN ON T2.common_id = FNN.common_id;
关键说明:
- 内层子查询通过
WHERE column_1 IS NOT NULL先过滤空值,再用ROW_NUMBER()为每个common_id下的记录按日期排序编号; - 外层筛选
row_num = 1,得到每个common_id下最早的非空column_1值; - 最后通过两次LEFT JOIN,同时关联原始表T1和预处理后的非空值表,实现CASE逻辑。
注意事项
- 请将代码中的
date_column替换为你table_1中实际存储日期的字段名; - 如果需要按日期倒序取最新的非空值,只需将
ORDER BY date_column ASC改为ORDER BY date_column DESC即可。
内容的提问来源于stack exchange,提问作者Jack Gruber
相关产品推荐
相关产品推荐

