2017-03-08 2 views
0

カラム値が変更されたテーブルの行を決定し、その結果をテーブルに出力することに関する質問(Find Row Changes and Output to Table)を投稿しました。以下のように(もちろんの受け入れ答えからの助けを借りて)成功した​​クエリがあった。行の変更(重複あり)とテーブルへの出力

;with x as (
select *, row_number() over(partition by ModelNum order by transdate) rn 
from table 
) 
select ModelNum, TransDate as 'StartTime', lead(TransDate) over (order by TransDate) as 'EndTime' from x where rn = 1 

私の問題は、しかし、元のテーブルがModelNumのための重複を持っているということですが、私はから使用しているコードソリューションはそれらを説明しません。テーブルをスキャンして最初と最後の値を探します。言い換えれば、元のテーブルは次のようにある場合:重複が列挙されているように、

id  TransDate   PartType 
====================================== 
1  2016-06-29 10:23:00 A 
2  2016-06-29 10:30:00 A 
3  2016-06-29 10:32:00 C 
4  2016-06-29 10:33:00 C 
5  2016-06-29 10:35:00 C 
6  2016-06-29 10:39:00 A 
7  2016-06-29 10:41:00 A 
8  2016-06-29 10:43:00 B 

がどのようにのように、あまりにも、I出力テーブルに結果を実行します。

PartType StartTime    EndTime  
======================================================= 
A   2016-06-29 10:23:00 2016-06-29 10:32:00 
C   2016-06-29 10:32:00 2016-06-29 10:39:00 
A   2016-06-29 10:39:00 2016-06-29 10:43:00 
B   2016-06-29 10:43:00 NULL 

また、中元の質問、私はSQLServer 2008を使用していましたが、今は2014年を使用しています。

答えて

1

これはギャップと島の問題です。私は行番号の違いでそれを解決するのが好きです:

with x as (
     select t.*, 
      row_number() over (order by transdate) as seqnum, 
      row_number() over (partition by ModelNum order by transdate) as seqnum_m 
     from table t 
    ) 
select ModelNum, min(TransDate) as StartTime, max(TransDate) as EndTime 
from x 
group by ModelNum, (seqnum - seqnum_m); 

これはちょっと難しいです。 CTEを実行して結果を見ると、探しているグループがどのように違いがあるかを「取得」します。

+0

エレガントです。ありがとう – controller

0

私があなたの質問を理解し、あなたがしたいのは、重複を含めるだけで、where句 "where = 1"をクエリから削除することができます。

関連する問題