TSQL - 数据操作 - 给定一段时间,将该时间段分解为更短的时间段

时间:2016-11-08 19:38:10

标签: sql-server tsql sas

我在医疗保健领域工作。我们的数据大部分时间都很糟糕。

https://i.stack.imgur.com/uzRX7.png

由于我还不允许发布图片,上面是图片的链接,从根本上总结了我想要做的事情。

例如,我知道收件人1234在2015年1月 - 2015年4月期间有资格获得补偿。

对于那个例子,我会得到一行数据:1234 01/2015 - 04/2015

由于时间跨度包含四个月,我需要数据显示四行而不是一行。

我需要第一行:1234 1
我需要第二行:1234 2
我需要第三排:1234 3
我需要第四行:1234 4

有没有办法在TSQL中执行此操作?也许一些棘手的TSQL编码?或者SAS编码和/或python编码?

2 个答案:

答案 0 :(得分:1)

在SAS:

data want;
   set have(rename=(Month = Month_Range) );

   Date_Start = input(scan(Month_Range, 1,'-','O'), anydtdte.);
   Date_End   = input(scan(Month_Range, 2,'-','O'), anydtdte.);

   do i = 0 to intck('month', Date_Start, Date_End);
       Actual_Date = intnx('month', Date_Start, i, 0, 'B');
       Month       = month(Actual_Date);
       output;
   end;

   format Actual_Date monyy.;

   keep Recipient_ID Month Actual_Date;
run;

答案 1 :(得分:0)

在SQL Server中,可能是这样的

Declare @YourTable Table (RecipiantID int,Month varchar(25))
Insert Into @YourTable values
(1234,'01/2015-04/2015')


;with cteM(M) As (Select N From (Values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)) N(N))
     ,cteY(Y) As (Select 1899+Row_Number() over (Order By (Select NULL)) From cteM N1, cteM N2) 
     ,cteD(D) As (Select DateFromParts(Y,M,1) From cteM Cross Join cteY)
Select A.RecipiantID
      ,Month       = Month(B.D)
      ,ActualMonth = Format(D,'MMM-yy')
 From @YourTable A
 Join cteD       B on D between cast(substring(Month,4,4)+'-'+left(Month,2)+'-01' as date) and cast(right(Month,4)+'-'+substring(Month,9,2)+'-01' as date)

返回

RecipiantID Month   ActualMonth
1234        1       Jan-15
1234        2       Feb-15
1234        3       Mar-15
1234        4       Apr-15