2017-03-29 16 views
1

は、これは次のように出力複雑なSQL変換

Reference StartDate     EndDate 
--------------------------------------------- 
1023175 2017-03-03 16:02:01.723  2017-03-07 07:59:49.283 
1023175 2017-03-07 07:59:49.283  2017-03-12 11:14:40.230 
1023175 2017-03-12 11:14:40.230  9999-12-31 00:00:00.000 (last record should have this value) 

これを達成することができる方法上の任意の提案私のソーステーブル

Reference ModifiedDate 
------------------------------------ 
1023175  2017-03-03 16:02:01.723 
1023175  2017-03-07 07:59:49.283 
1023175  2017-03-12 11:14:40.230 

ineedでは、対象のですか?

+2

関連していない製品にはタグを付けないでください。タグを1つ戻します。これは、使用しているdbmsのタグです。 – jarlh

+1

ソースからのソースからの左結合を提案してもよいですか? –

+1

また、特定のバージョンタグが役に立つかもしれません –

答えて

2
DECLARE @MyTable TABLE (Reference INT, ModifiedDate DATETIME) 
INSERT INTO @MyTable VALUES 

(1023175, '2017-03-03 16:02:01.723'), 
(1023175, '2017-03-07 07:59:49.283'), 
(1023175, '2017-03-12 11:14:40.230'); 

SELECT 
    T1.Reference, 
    T1. ModifiedDate AS Start_Date, 
    COALESCE(MIN(T2.ModifiedDate),CAST('31/12/9999' AS DATETIME)) as EndDate 
FROM @MyTable T1 
    LEFT JOIN @MyTable T2 
ON T1.reference = T2.reference AND T1.ModifiedDate < T2.ModifiedDate 
GROUP BY 
    T1.Reference, 
    T1. ModifiedDate 
3

リード/ラグウィンドウ機能を使用できます。それ以降SQL Server2012から作品...これは9iのからのOracleのバージョンで動作しますgenereated ROW_NUMBERと

select Reference, ModifiedDate as StartDate, 
    lead(ModifiedDate, 1, '9999-12-31 00:00:00.000') over(order by Reference) as EndDate 
    from #yourreference 

表の詳細

create table #yourreference (Reference int, ModifiedDate datetime) 

insert into #yourreference (
Reference , ModifiedDate) values 
(1023175 ,'2017-03-03 16:02:01.723') 
,(1023175 ,'2017-03-07 07:59:49.283') 
,(1023175 ,'2017-03-12 11:14:40.230') 
+0

一部のデータベース製品ではありません。 SQL Serverは、2012年版の遅延と鉛をサポートし始めたばかりです。私はOracleやSqliteについて知らない。 –

+0

私は2008年のSQLを持っているので、didnt仕事 –

0
select a.Reference, a.ModifiedDate as StartDate, 
     coalesce(min(b.ModifiedDate),9999-12-31 00:00:00.000) as EndDate 
from source_table as a 
left join source_table as b 
on a.reference = b.reference and a.ModifiedDate < b.ModifiedDate 
group by a.Reference, a.ModifiedDate 
0

に参加するその前に、あなたは自己を実行する必要があります。

select reference 
     , modifieddate as startdate 
     , lead (modifieddate, 1, to_timestamp('9999-12-31 00:00:00.000', 'yyyy-mm-dd hh24:mi:ss.ff3')) 
       over (partition by reference order by modifieddate) as enddate 
from your_table; 

正しい値を確保するには、ウィンドウ処理の節をmodifieddateでソートする必要がありますe。