基于其他列但有条件创建列

Posted

技术标签:

【中文标题】基于其他列但有条件创建列【英文标题】:Create column based on other column but with conditions 【发布时间】:2021-01-27 15:19:33 【问题描述】:

我对 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 字段

【问题讨论】:

最好不要实际更改表。使用@GordonLinoff 的答案进行查询。否则你的表将被非规范化(多个地方获取相同的信息) 【参考方案1】:

我想你想要lead():

select t.*,
       dateadd(day, -1,
               lead(start_date) over (partition by code order by start_date)
              ) as end_date
from t;

注意:我建议不要减去一天作为结束日期,因此结束日期不包含在内。这使得结束日期与下一个开始日期相同,我发现这样更容易确保数据中没有间隙或重叠。

【讨论】:

非常感谢戈登。非常感谢。我从未听说过领导职能,但这听起来像是赢家。

以上是关于基于其他列但有条件创建列的主要内容,如果未能解决你的问题,请参考以下文章

基于其他列条件的累计和

基于 MySQL 中其他列的查询条件列

Python - 基于其他列条件的新列[重复]

选择条件列但获取子查询返回超过 1 个值

创建 2 个具有相同键列但不同包含列的非聚集索引

MySQL-如何根据不同列但同一行中的值选择列? [关闭]