2017-05-05 22 views
0

我想「清理」數據集並聲明新變量,然後根據等級輸入日期。根據等級聲明新變量和輸入日期

我的數據集是這樣的:

+-----+--------------+------------+-------+ 
| ID | Start_date | End_date | Rank | 
+-----+--------------+------------+-------+ 
| a | May '16  | May '16 |  5 | 
| a | Jun '16  | Jul '16 |  4 | 
| a | Jul '16  | Aug '16 |  3 | 
| a | Aug '16  | NULL '16 |  2 | 
| a | Sept '16  | NULL '16 |  1 | 
+-----+--------------+------------+-------+ 

我基本上要輸入等級1的開始日期爲2級的結束日期,或者說輸入開始到5月底6(總是-1)。

寫了下面的根據ID和日期選擇爲tempory表和等級:

SELECT 
    [Start_Date] as 'start' 
    ,[End_Date] as 'end' 
     ,[Code] as 'code' 
     ,[ID] as 'id' 
    ,rank() over (partition by [id] order by [Start_Date]) as 'rank' 
INTO #1 
FROM [Table] 
ORDER BY [id] 

其下面的部分是不工作...

DECLARE new_end 
BEGIN select [#1].[start] into new_end FROM [#1] 
WHERE (
    ([#1].[rank] = 1) 
    AND ([#1].[end] IS NULL) 
    ) 
+0

發表您的預計輸出,這樣每個人都可以輕鬆幫。 – Tomato32

回答

0

假設你已經有你的問題提供的數據集,這只是一個簡單的自我join,不是嗎?

declare @t table(ID nvarchar(1), Start_date date, End_date date, [Rank] int); 
insert into @t values ('a','20170501','20170501',5),('a','20170601','20170701',4),('a','20170701','20170801',3),('a','20170801',NULL,2),('a','20170901',NULL,1); 

select t1.ID 
     ,t1.Start_date 
     ,isnull(t1.End_date,t2.Start_date) as End_date 

     -- If you *always* want to overwrite the End_Date use this instead: 
     -- ,t2.Start_date as End_date 

     ,t1.[Rank] 
from @t t1 
    left join @t t2 
     on(t1.[Rank] = t2.[Rank]+1); 

輸出:

+----+------------+------------+------+ 
| ID | Start_date | End_date | Rank | 
+----+------------+------------+------+ 
| a | 2017-05-01 | 2017-05-01 | 5 | 
| a | 2017-06-01 | 2017-07-01 | 4 | 
| a | 2017-07-01 | 2017-08-01 | 3 | 
| a | 2017-08-01 | 2017-09-01 | 2 | 
| a | 2017-09-01 | NULL  | 1 | 
+----+------------+------------+------+ 
+0

謝謝 - 多數民衆贊成 – tj123