sql - 基于其他列但有条件创建列
问题描述
我对 SQL 很陌生,我根本无法为以下问题制定方法:
我有这张表,上面有代码的开始日期
Row Code Start Date Product
1 A1 2020-01-01 X
2 A1 2020-05-15 Y
3 A2 2020-02-02 X
4 A3 2020-01-31 Z
5 A3 2020-02-15 Y
6 A3 2020-12-31 X
最终我需要能够查询另一个表并找出某个日期的代码是什么产品,所以 2020-01-10 的代码 A1 是 = X,但今天的代码 A1 是 = Y
我想我可以弄清楚如何在 where 子句中使用 between 语句,但我无法弄清楚如何更改表以具有结束日期,所以它看起来像这样:
Row Code Start_Date Product End_Date
1 A1 2020-01-01 X 2020-05-14
2 A1 2020-05-15 Y NULL
3 A2 2020-02-02 X NULL
4 A3 2020-01-31 Z 2020-02-14
5 A3 2020-02-15 Y 2020-12-30
6 A3 2020-12-31 X NULL
请注意,数据库没有 End_Date 字段
解决方案
我想你想要lead()
:
select t.*,
dateadd(day, -1,
lead(start_date) over (partition by code order by start_date)
) as end_date
from t;
注意:我建议不要为结束日期减去一天,因此结束日期不包括在内。这使得结束日期与下一个开始日期相同,我发现这更容易确保数据中没有间隙或重叠。
推荐阅读
- python - Pygame - 黑屏显示
- maven - 在 maven 的物料清单中如何解决未选择版本的依赖项的功能?
- javascript - 使用 lodash 基于时刻时间戳执行嵌套分组
- sql - 如何使用 node-postgresql 动态查询表
- php - 从谷歌驱动器发送图像或通过谷歌驱动器 url 获取图像名称
- database - 多个表空间上的 Oracle 数据库
- python - 去除字符之间的空格并阻止用户输入包含整数或标点符号
- c# - IgnoreQueryFilters 不会忽略布尔值上的过滤器
- javascript - 使用javascript将带有类名的span添加到字符串的某些字符
- c++ - val1, val2, val3, val4 的值是如何计算的?