假设我的数据如下所示:
interval_id indiv_id role start_date end_date
1 1 A 2006-05-01 2006-06-16
2 1 B 2006-06-16 2006-10-16
3 1 A 2006-10-16 2009-10-16
4 1 B 2009-10-16 2014-04-23
5 2 A 2007-12-15 2009-10-16
6 2 B 2009-10-16 2011-07-01
但我希望数据看起来像这样(以第一个角色间隔为例):
interval_id indiv_id role day
1 1 A 2006-05-01
1 1 A 2006-05-02
1 1 A 2006-05-03
1 1 A 2006-05-04
1 1 A 2006-05-05
1 1 A 2006-05-06
... ... ... ...
1 1 A 2006-06-16
我已经问过并接受了how to best do this in R的答案。我如何在MS SQL中执行此操作?
在形成答案时,假设没有NULL数据。
感谢。
答案 0 :(得分:1)
首先创建一个数字表:
DECLARE @number_of_numbers INT = 100000;
;WITH
a AS (SELECT 1 AS i UNION ALL SELECT 1),
b AS (SELECT 1 AS i FROM a AS x, a AS y),
c AS (SELECT 1 AS i FROM b AS x, b AS y),
d AS (SELECT 1 AS i FROM c AS x, c AS y),
e AS (SELECT 1 AS i FROM d AS x, d AS y),
f AS (SELECT 1 AS i FROM e AS x, e AS y),
numbers AS
(
SELECT TOP(@number_of_numbers)
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS number
FROM f
)
创建一个变量@MinDate,这是表中最早的日期(或者你可以选择类似1/1/2000等的东西 现在加入你的桌子对着那个cte数字表,你会得到你的个人日期:
SELECT m.interval_id, m.indiv_id, m.role, b.CheckDate
FROM MyTable m
INNER JOIN
(
SELECT DATEADD(DAY, n.Number, @MinDate) AS CheckDate
FROM numbers n
) AS b
ON b.CheckDate >= m.start_date AND b.CheckDate <= m.end_date
ORDER BY b.CheckDate
答案 1 :(得分:0)
我知道它不是一个好主意......但你可以对已经存在的数据做一个光标,并使用dateadd的while,以便它从每个记录的Start到end迭代,然后将它插入到你的位置需要它。