使用SQL展示前导、滞后记录关键信息的技术问询
展示前导(LEAD)与滞后(LAG)记录关键信息的SQL实现
我帮你优化并完善了SQL语句,不仅能计算出前导/滞后的日期,还会关联展示对应版本的ID,让版本间的衔接关系更直观。下面是完整的实现:
WITH version_data AS ( SELECT 'Vrandom1' AS VERSION_ID, CAST('2018-03-22' AS DATE) AS START_DATE, '9999-12-31' AS END_DATE, 1 AS IS_APPROVED UNION ALL SELECT 'Vrandom2' AS VERSION_ID, CAST('2020-05-15' AS DATE) AS START_DATE, '9999-12-31' AS END_DATE, 1 AS IS_APPROVED UNION ALL SELECT 'Vrandom3' AS VERSION_ID, CAST('2022-09-01' AS DATE) AS START_DATE, '9999-12-31' AS END_DATE, 1 AS IS_APPROVED ) SELECT v.VERSION_ID AS CURRENT_VERSION, v.START_DATE AS CURRENT_START_DATE, -- 计算当前版本的实际结束日期(下一个版本开始前一天,若无则用默认值) CAST(ISNULL(DATEADD(DAY, -1, LEAD(v.START_DATE) OVER (ORDER BY v.START_DATE)), '9999-12-31') AS DATE) AS CURRENT_END_DATE, -- 获取前导(下一个)版本的信息 LEAD(v.VERSION_ID) OVER (ORDER BY v.START_DATE) AS NEXT_VERSION, LEAD(v.START_DATE) OVER (ORDER BY v.START_DATE) AS NEXT_VERSION_START_DATE, -- 获取滞后(上一个)版本的信息 LAG(v.VERSION_ID) OVER (ORDER BY v.START_DATE) AS PREVIOUS_VERSION, LAG(v.START_DATE) OVER (ORDER BY v.START_DATE) AS PREVIOUS_VERSION_START_DATE FROM version_data v ORDER BY v.START_DATE;
关键逻辑说明
- CTE
version_data:这里用WITH子句封装了你的示例数据,比嵌套子查询更易读,后续可以直接替换成你的实际表名。 LEAD()函数:按START_DATE排序后,获取当前行的下一行数据,用来展示下一个版本的ID和开始日期,同时计算当前版本的有效结束日期(下一个版本开始的前一天)。LAG()函数:同理,获取当前行的上一行数据,展示上一个版本的ID和开始日期。- 默认值处理:用
ISNULL()处理首尾行的情况(第一个版本没有上一个,最后一个版本没有下一个),给这些位置填充明确的默认提示(这里用9999-12-31作为结束日期默认值,版本ID则显示为NULL,你可以根据需求调整)。
示例输出
| CURRENT_VERSION | CURRENT_START_DATE | CURRENT_END_DATE | NEXT_VERSION | NEXT_VERSION_START_DATE | PREVIOUS_VERSION | PREVIOUS_VERSION_START_DATE |
|---|---|---|---|---|---|---|
| Vrandom1 | 2018-03-22 | 2020-05-14 | Vrandom2 | 2020-05-15 | NULL | NULL |
| Vrandom2 | 2020-05-15 | 2022-08-31 | Vrandom3 | 2022-09-01 | Vrandom1 | 2018-03-22 |
| Vrandom3 | 2022-09-01 | 9999-12-31 | NULL | NULL | Vrandom2 | 2020-05-15 |
这样就能清晰看到每个版本的时间范围,以及它和前后版本的关联关系了。
内容的提问来源于stack exchange,提问作者Sourabh
相关产品推荐
相关产品推荐

