SQL Server:从枚举日期创建新记录

时间:2018-02-13 19:43:58

标签: sql-server

我有一个表格,格式如下:

id,transaction_dt,units,measures
1,2018-01-01,4,30.5
1,2018-01-03,4,26.3
2,2018-01-01,3,12.7
2,2018-01-03,3,8.8 

我想要完成的是堆叠并枚举' transaction_dt'基于'单位'的价值在同一记录中的字段并将它们展开到新记录中以生成如下内容:

id,transaction_dt,measures
1,2018-01-01,30.5
1,2018-01-02,30.5
1,2018-01-03,30.5
1,2018-01-04,30.5
1,2018-01-03,26.3
1,2018-01-04,26.3
1,2018-01-05,26.3
1,2018-01-06,26.3
2,2018-01-01,12.7
2,2018-01-02,12.7
2,2018-01-03,12.7
2,2018-01-03,8.8
2,2018-01-04,8.8
2,2018-01-05,8.8 

我目前有一个python脚本可以实现这一点,但我认为出于性能原因,我最终可能最好做这个服务器端。任何有关基于SQL的高性能方法的建议都将受到诚挚的赞赏。

1 个答案:

答案 0 :(得分:1)

到目前为止,最简单的方法是使用数字或计数表。我把它作为我的系统中的一个视图,就像这样。你可以在这里阅读Jeff Moden关于这个主题的精彩文章。 (你可能会注意到我的观点基本上是他的行为,他也借用了)。 http://www.sqlservercentral.com/articles/T-SQL/62867/

create View [dbo].[cteTally] as

WITH
    E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
    E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
    E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
    cteTally(N) AS 
    (
        SELECT  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
    )
select N from cteTally
GO

当然我没有任何样本数据,所以首先我必须这样做。

declare @Something table
(
    id int
    , transaction_dt date
    , units int
    , measures decimal(7,2)
)
insert @Something
values

(1, '2018-01-01', 4, 30.5)
,(1, '2018-01-03', 4, 26.3)
,(2, '2018-01-01', 3, 12.7)
,(2, '2018-01-03', 3, 8.8)

然后以您想要的方式获取数据非常简单。

select s.id
    , DATEADD(day, t.N - 1, s.transaction_dt)
    , s.measures
from @Something s
join cteTally t on t.N <= s.units
order by s.id
    , s.transaction_dt
    , t.N