2017-05-05 6 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 | 
+-----+--------------+------------+-------+ 

私は基本的に、ランク2の終了日に入力するランク1の開始日をしたいか、入力を言う(常に-1)端部6に5を起動します。

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

あなたと仮定すると:

は、IDと日付に基づいてtemporyテーブルとランクに選択するには、次の書かれていますあなたの質問に記載されているように、既にあなたのデータセットを持っています。これは単純な自己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

ありがとう - thats great – tj123

関連する問題