使用SQL生成连续月份

我有一个类似以下示例的表格:

code |  date       | value
1000   2016-08-05    5000
1000   2016-12-27    8000
1000   2018-03-19    6000
1000   2018-06-02    6000

现在,我需要像这样生成连续的月份:

code |  date       | value
1000   2016-08-05    5000
1000   2016-09-05    5000
1000   2016-10-05    5000
1000   2016-11-05    5000
1000   2016-12-27    8000
1000   2017-01-27    8000
1000   2017-02-27    8000
........
1000   2018-03-19    6000
1000   2018-04-19    6000
1000   ....

序列将一直持续到达到代码的最大日期为止。在此示例中,代码1000的最大日期为2018-06-02。如何生成月份序列?任何帮助将不胜感激。

afang2468 回答:使用SQL生成连续月份

尝试一下:

DECLARE @DataSource TABLE
(
    [Code] INT,[Date] DATE,[value] INT
);

INSERT INTO @DataSource ([Code],[Date],[value])
VALUES (1000,'2016-08-05',5000),(1000,'2016-12-27',8000),'2018-03-19',6000),'2018-06-02',6000);

WITH Ranges AS
(
    SELECT *,LEAD([Date]) OVER (ORDER BY [Date] ASC) AS [DateEnd]
    FROM @DataSource DS
)
SELECT *
FROM Ranges
CROSS APPLY
(
    SELECT DATEADD(MONTH,[number],[Date])
    FROM 
    (
        select number 
        from master.dbo.spt_values
        where [type] = 'P'
    ) numbers
    WHERE DATEADD(MONTH,[Date]) < [DateEnd]
) AutoDates ([GeneratedDate]);

enter image description here

这个想法很简单-使用LEAD获取日期范围的上限。然后有了开始和结束日期,只需使用DATEADD函数生成缺少的月份即可。

,

一种解决方案是在递归CTE中创建数字表,然后与该表连接。您可以使用not exists连接条件来定义每个系列的边界:据我了解,您每个月只需要一个日期(在同一个月中没有间隔和重叠),因此我将eomonth()用于那个。

查询:

with nums(i) as (
    select 0
    union all select i + 1 from nums where i < 24
)
select 
    t.code,dateadd(month,i,t.date) date,t.value
from mytable t
inner join nums n 
    on not exists (
        select 1
        from mytable t1
        where t1.date > t.date and eomonth(t1.date) < eomonth(dateadd(month,i + 1,t.date))
    )
order by date

您可以将cte中的上限扩展到连续的最大月份数(我将其设置为24)。

Demo on DB Fiddle

code | date                | value
---: | :------------------ | ----:
1000 | 05/08/2016 00:00:00 |  5000
1000 | 05/09/2016 00:00:00 |  5000
1000 | 05/10/2016 00:00:00 |  5000
1000 | 05/11/2016 00:00:00 |  5000
1000 | 27/12/2016 00:00:00 |  8000
1000 | 27/01/2017 00:00:00 |  8000
1000 | 27/02/2017 00:00:00 |  8000
1000 | 27/03/2017 00:00:00 |  8000
1000 | 27/04/2017 00:00:00 |  8000
1000 | 27/05/2017 00:00:00 |  8000
1000 | 27/06/2017 00:00:00 |  8000
1000 | 27/07/2017 00:00:00 |  8000
1000 | 27/08/2017 00:00:00 |  8000
1000 | 27/09/2017 00:00:00 |  8000
1000 | 27/10/2017 00:00:00 |  8000
1000 | 27/11/2017 00:00:00 |  8000
1000 | 27/12/2017 00:00:00 |  8000
1000 | 27/01/2018 00:00:00 |  8000
1000 | 27/02/2018 00:00:00 |  8000
1000 | 19/03/2018 00:00:00 |  6000
1000 | 19/04/2018 00:00:00 |  6000
1000 | 19/05/2018 00:00:00 |  6000
1000 | 02/06/2018 00:00:00 |  6000
1000 | 02/07/2018 00:00:00 |  6000
1000 | 02/08/2018 00:00:00 |  6000
1000 | 02/09/2018 00:00:00 |  6000
1000 | 02/10/2018 00:00:00 |  6000
1000 | 02/11/2018 00:00:00 |  6000
1000 | 02/12/2018 00:00:00 |  6000
1000 | 02/01/2019 00:00:00 |  6000
1000 | 02/02/2019 00:00:00 |  6000
1000 | 02/03/2019 00:00:00 |  6000
1000 | 02/04/2019 00:00:00 |  6000
1000 | 02/05/2019 00:00:00 |  6000
1000 | 02/06/2019 00:00:00 |  6000
1000 | 02/07/2019 00:00:00 |  6000
1000 | 02/08/2019 00:00:00 |  6000
1000 | 02/09/2019 00:00:00 |  6000
1000 | 02/10/2019 00:00:00 |  6000
1000 | 02/11/2019 00:00:00 |  6000
1000 | 02/12/2019 00:00:00 |  6000
1000 | 02/01/2020 00:00:00 |  6000
1000 | 02/02/2020 00:00:00 |  6000
1000 | 02/03/2020 00:00:00 |  6000
1000 | 02/04/2020 00:00:00 |  6000
1000 | 02/05/2020 00:00:00 |  6000
1000 | 02/06/2020 00:00:00 |  6000
本文链接:https://www.f2er.com/3161384.html

大家都在问