首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Server:从枚举日期创建新记录

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

Stack Overflow用户
提问于 2018-02-14 03:43:58
回答 1查看 69关注 0票数 0

我有一个通用格式的表格:

代码语言:javascript
复制
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‘字段的值来堆叠和枚举'units’,并将它们展开到新的记录中,以产生如下所示的结果:

代码语言:javascript
复制
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的性能方法有任何建议,我们将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-14 03:54:13

到目前为止,最简单的方法是使用数字或理货表。我将其作为视图保存在我的系统中,如下所示。你可以在这里阅读Jeff Moden关于这个主题的一篇很棒的文章。(你可能注意到,我的观点基本上是他的所作所为,他也借用了这一点)。http://www.sqlservercentral.com/articles/T-SQL/62867/

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48774458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档