【问题标题】:SQL Server: populating rows between two datesSQL Server:填充两个日期之间的行
【发布时间】:2014-11-04 17:55:32
【问题描述】:

我正在尝试找出一种最佳方法来填充两个月度日期之间缺失的行。

这是我的输入数据的样子:

ID    Date        Value
100   8/1/2011    1
100   10/1/2011   2
103   8/1/2011    3

这是我的输出需要的样子:

ID    Date       Value
100   8/1/2011   1
100   9/1/2011   1
100   10/1/2011  2
100   11/1/2011  2
100   12/1/2011  2    ...till current date
103   8/1/2011   3
103   9/1/2011   3
103   10/1/2011  3
103   11/1/2011  3
103   12/1/2011  3   ...till current date

生成日期不是问题,但是,不确定如何在不使用非常慢的 for 循环的情况下跨日期范围复制值列。

任何想法都非常感谢!

【问题讨论】:

  • 帖子编辑器中的波浪形大括号图标 {} 会将一个部分格式化为代码,让您免于数百个从未完全对齐的   的疯狂。
  • 您应该看看这里的格式是如何工作的,而不必像 Goat 已经说过的那样做所有nbsp;。这是格式帮助的链接:stackoverflow.com/editing-help#code 现在我将您的帖子更改为标准格式,希望您没问题。
  • 感谢格式化!

标签: sql sql-server sql-server-2008 optimization


【解决方案1】:

您可以使用ROW_NUMBER() 函数和自连接来创建日期范围,然后将其连接到您的日期表中:

;with  cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Dt) RN
               FROM Table1)
      ,cte2 AS (SELECT a.ID
                      ,a.dt BegDt
                      ,ISNULL(b.dt,GETDATE()) EndDt
                      ,a.Value
                FROM cte a
                LEFT JOIN cte b
                   ON a.RN = b.RN -1
                   AND a.ID = b.ID)
      ,dt AS (SELECT CAST('2011-08-01' AS DATE) Dt
              UNION  ALL
              SELECT DATEADD(month,1,dt)
              FROM dt
              WHERE dt < '2011-12-01') --GETDATE() for current
SELECT a.ID,b.Dt,a.Value
FROM cte2 a
JOIN dt b
  ON b.dt >= a.BegDt
   AND b.dt < a.EndDT
ORDER BY ID, DT

演示:SQL Fiddle

【讨论】:

    猜你喜欢
    • 2019-07-20
    • 2023-01-05
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    相关资源
    最近更新 更多