我有一个通用格式的表格:
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’,并将它们展开到新的记录中,以产生如下所示的结果:
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的性能方法有任何建议,我们将不胜感激。
发布于 2018-02-14 03:54:13
到目前为止,最简单的方法是使用数字或理货表。我将其作为视图保存在我的系统中,如下所示。你可以在这里阅读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.Nhttps://stackoverflow.com/questions/48774458
复制相似问题