如何在 SQL 中从生效日期创建时间序列

Posted

技术标签:

【中文标题】如何在 SQL 中从生效日期创建时间序列【英文标题】:How to create a time series from effective dates in SQL 【发布时间】:2020-01-16 15:48:25 【问题描述】:

名为“模板”的第一个表具有如下所示的有效日期和配置列:

第二个表是包含日期、会计周和会计年度的会计日历。

第一个生效日期在第 39 会计周,而下一个生效日期在第 42 会计周。这意味着第 40 和第 41 会计周应该与第 39 会计周具有相同的配置。我需要一个反映这一点的输出。我编写了以下 sn-p 但输出不正确,并在第 42 财政周显示配置 D。

SELECT * 
FROM ( 
  SELECT a.FiscalYear, a.FiscalWeek, EffectiveDate, Configuration,
         ROW_NUMBER() OVER (PARTITION BY CONCAT(FiscalYear,FiscalWeek,EffectiveDate,Configuration) ORDER BY EffectiveDate ) AS rn 
  FROM [Template], 
       [FiscalCalendar] AS a 
  WHERE AND a.FiscalDate BETWEEN '2019-10-27' AND '2019-11-17' 
    AND EffectiveDate BETWEEN '2019-10-27' AND '2019-11-17' 
    AND EffectiveDate = a.FiscalDate 
) AS t WHERE t.rn = 1

【问题讨论】:

【参考方案1】:

方括号的使用表明数据库是SQL Server,所以我假设是这种情况。

对于日历表中的每一行,您都需要最新的配置。这听起来像是横向连接,即apply:

select cw.*, t.configuration
from (select c.fiscalweek, c.fiscalyear, min(c.fiscaldate) as weekstart
      from calendar c
      group by c.fiscalweek, c.fiscalyear
     ) cw cross apply
     (select top (1) with ties t.*
      from template t
      where t.effectivedate <= cs.weekstart
      order by t.effectivedate desc
     ) t;

这里的一个“棘手”部分是结果是按周而不是按天计算的。从日历表中提取周数可能比使用聚合更简单。

【讨论】:

以上是关于如何在 SQL 中从生效日期创建时间序列的主要内容,如果未能解决你的问题,请参考以下文章

如何在 POSTGRESQL 中从 DATE 中提取年份

如何在 SQL Server 中从今天的日期获取 > 240 天的数据,其中某些记录的特定单元键在 240 天之内和之外

如何在javascript中从字符串创建日期对象[重复]

在sql中从字符串转换为日期时间[重复]

如何在数据表中从 '2021-01-09T00:00:00' LIKE 2021-01-09 转换日期时间格式

在 MS Access SQL 查询中从普通日期转换为 unix 纪元日期