如何按ID筛选OrderID从NULL变为有效值的首行记录?
问题与解决方案
原始数据
| RowNum | CreateDT | ID | OrderID |
|---|---|---|---|
| 1 | 2022-03-04 12:01:54.000 | 55 | NULL |
| 2 | 2022-03-04 12:05:11.000 | 55 | 12700 |
| 1 | 2023-01-20 03:44:07.000 | 698 | NULL |
| 2 | 2023-01-24 17:51:35.000 | 698 | 24525 |
| 3 | 2023-01-25 20:00:43.000 | 698 | 24525 |
| 1 | 2023-02-13 09:12:01.000 | 1001 | NULL |
| 2 | 2023-02-13 10:27:58.000 | 1001 | NULL |
| 3 | 2023-02-17 22:09:22.000 | 1001 | 26831 |
需求
按ID筛选出OrderID字段从NULL首次变为有效值的那一行记录,预期结果为每个ID最早出现非NULL OrderID的行。
实现方案
方法一:使用窗口函数ROW_NUMBER()
通过窗口函数对每个ID下的非NULL OrderID行按创建时间排序,取每组的第一行:
WITH ranked_data AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY ID ORDER BY CreateDT ASC ) AS rn FROM your_table WHERE OrderID IS NOT NULL ) SELECT RowNum, CreateDT, ID, OrderID FROM ranked_data WHERE rn = 1;
方法二:先聚合取最早时间再关联
先统计每个ID首次出现有效OrderID的时间,再关联原表取出对应行:
SELECT t.* FROM your_table t INNER JOIN ( SELECT ID, MIN(CreateDT) AS first_valid_dt FROM your_table WHERE OrderID IS NOT NULL GROUP BY ID ) sub ON t.ID = sub.ID AND t.CreateDT = sub.first_valid_dt;
两种方法都能精准筛选出每个ID中OrderID从NULL首次变为有效值的记录,可根据实际数据库环境选择使用。
内容的提问来源于stack exchange,提问作者joru100
相关产品推荐
相关产品推荐

