2017-01-12 1 views
1

私はSQL Server 2012でウィンドウ関数を使用していましたが、カーソルを避けて行ごとに移動したいので、これを動作させることはできません。私の問題は、各レコードにグループ番号を追加する必要があることです。トリッキーな部分は、カラム値が変更されるたびに、レコードのシーケンスの前に存在していた値に戻っても、グループ番号が増加する必要があるということです。列の値が変更されたときに、SQL Server 2012のシーケンシャルレコードにグループ番号を追加するにはどうすればよいですか?

は、ここではデータの例だと、私の希望する結果:

if object_id('tempdb..#data') is not null 
    drop table #data 

create table #data 
(
    id int identity(1,1) 
    ,mytime datetime 
    ,distance int 
    ,direction varchar(20) 
) 

insert into #data (mytime, distance, direction) 
values 
('2016-01-01 08:00',10,'North') 
,('2016-01-01 08:30',18,'North') 
,('2016-01-01 09:00',15,'North') 
,('2016-01-01 09:30',12,'South') 
,('2016-01-01 10:00',16,'South') 
,('2016-01-01 10:30',45,'North') 
,('2016-01-01 11:00',23,'North') 
,('2016-01-01 11:30',14,'South') 
,('2016-01-01 12:00',40,'South') 

望ましい結果:

mytime    Distance Direction GroupNumber 
-------------------------------------------------------- 
2016-01-01 8:00  10   North  1 
2016-01-01 8:30  18   North  1 
2016-01-01 9:00  15   North  1 
2016-01-01 9:30  12   South  2 
2016-01-01 10:00 16   South  2 
2016-01-01 10:30 45   North  3 
2016-01-01 11:00 23   North  3 
2016-01-01 11:30 14   South  4 
2016-01-01 12:00 40   South  4 

は、ウィンドウ関数を使用して、このことは可能ですか?

WITH T 
    AS (SELECT *, 
       CASE 
        WHEN LAG(direction) 
         OVER (ORDER BY ID) = direction THEN 0 
        ELSE 1 
       END AS Flag 
     FROM #data) 
SELECT mytime, 
     Distance, 
     Direction, 
     SUM(Flag) OVER (ORDER BY id) AS GroupNumber 
FROM T 

上記のだろう

答えて

3

一つの方法は、DirectionがどのNULLsが含まれていません想定しています。可能であれば、それは軽微な調整が必要です。本当にうれしいですしかし、あなたも

(これはその後、以下のバリアントがうまくいくケースだったと仮定した場合)二つの連続 NULLが等しいとして扱われるべきかどうかを定義する必要があります
WITH T 
    AS (SELECT *, 
       prev = LAG(direction) OVER (ORDER BY ID), 
       rn = ROW_NUMBER() OVER (ORDER BY ID) 
     FROM #data) 
SELECT mytime, 
     Distance, 
     Direction, 
     SUM(CASE WHEN rn > 1 AND EXISTS(SELECT prev 
             INTERSECT 
             SELECT Direction) THEN 0 ELSE 1 END) OVER (ORDER BY id) AS GroupNumber 
FROM T 
ORDER BY ID 
+1

。 –

+0

これは素晴らしいことです。私は方向フィールドのNULL値や空白の値があると思いますが、それらをフィルタリングしている可能性があります。 – BeachBum

関連する問題