【问题标题】:Generate multiples rows of new column based on one value of another column根据另一列的一个值生成多行新列
【发布时间】:2022-10-21 21:20:54
【问题描述】:

我有一个如下表:

ID Date
1 2022-01-01
2 2022-03-21

我想根据日期添加一个新列,它应该看起来像这样

ID Date NewCol
1 2022-01-01 2022-02-01
1 2022-01-01 2022-03-01
1 2022-01-01 2022-04-01
1 2022-01-01 2022-05-01
2 2022-03-21 2022-04-21
2 2022-03-21 2022-05-21

假设有一个@EndDate = 2022-05-31(这就是它应该停止的地方)

我很难弄清楚如何在 SSMS 中做到这一点。将不胜感激任何见解!谢谢 :)

【问题讨论】:

  • 你需要解释这里的逻辑。
  • 您需要将所有Months 添加为两个日期值之间的日期吗?
  • 2022-01-31 怎么样?应该添加哪些日期?因为没有 2022-02-31,也没有 2022-04-31。
  • 如果是这种情况,您可以使用DATEADD(month, 1, dateColumn)

标签: sql sql-server ssms


【解决方案1】:

有很多方法可以将一行“分解”成一个集合,我认为最简单的是递归 CTE:

DECLARE @endpoint date = '20220531';

WITH x AS
(
  SELECT ID, date FROM dbo.YourTableName
  UNION ALL
  SELECT ID, DATEADD(MONTH, 1, date) FROM x
    WHERE date <= DATEADD(MONTH, -1, @endpoint)
)
SELECT ID, date FROM x;

this fiddle 中的工作示例。

请注意,如果您的时间超过 100 个月,则需要添加 OPTION (MAXRECURSION)(或者只是考虑大规模使用不同的解决方案)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 2020-05-24
    相关资源
    最近更新 更多