2016-10-17 7 views
2

を追加し、私は(ビュー)のデータを以下している:が追加行

Declare @YourTable table ([Event] varchar(100),[Start] DateTime,[End] DateTime, [Tag] varchar(25)) 
    Insert Into @YourTable values 
    ('10PIC700422.PV 10-PSV-700073A 10-PSV-700073B','9/9/16 10:44:05.000','9/9/16 10:48:08.000','Big'), 
    ('10PIC700422.PV 10-PSV-700073A 10-PSV-700073B','9/9/16 10:44:10.000','9/9/16 10:49:40.000','Big'), 
    ('10PIC700422.PV 10-PSV-700073A 10-PSV-700073B','9/9/16 10:50:03.000','9/9/16 10:51:04.000','Small'), 
    ('11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4/4/16 12:51:07.000','4/4/16 13:58:09.000','Big'), 
    ('11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4/4/16 14:04:04.000','4/4/16 14:29:00.000','Small'), 
    ('11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4/4/16 14:51:02.000','4/4/16 14:58:00.000','Big'), 
    ('11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4/4/16 15:04:06.000','4/4/16 15:29:08.000','Small'), 
    ('11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4-4-16 15:45:08.000','4-4-16 15:55:09.000','Big'), 
    ('11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4-4-16 16:22:08.000','4-4-16 16:40:09.000','Big'), 
    ('11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4/4/16 16:50:04.000','4/4/16 16:55:00.000','Small'), 
    ('11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4/4/16 17:05:02.000','4/4/16 17:20:00.000','Big'), 
    ('11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4/4/16 17:22:06.000','4/4/16 17:29:08.000','Small'), 
    ('11PIC41010.PV 11-PSV-401002W 11-PSV-401002D','4/4/16 16:04:01.000','4/4/16 16:45:00.000','Big'); 

は、私は、スタートして、イベントや順序でグループを必要とする結果、大きな後に行くたび小さな小さなに大きな変更を取得するには、次の問合せを使用します。

私は以下の順序はグループ内のタグの列に表示されたときに、それに応じSTARTTIME、終了時刻とTag_newの大きな小さく、前後aditionalの行を追加する必要があり、STARTTIMEは1秒である必要があり、もう一つの例外を適用する必要があり
Select [Event] 
    ,[Start] 
    ,[End] 
    ,[Tag] 
    ,[Tag_new] = case when Tag='Big' and 'Small' = Lead(Tag,1,Tag) over (Partition By Event Order By Start) then 'Small' else tag end 
    From @YourTable 

             Event Start     End      Tag Tag_new 
10PIC700422.PV 10-PSV-700073A 10-PSV-700073B 2016-09-09 10:44:05.000 2016-09-09 10:48:08.000 Big Big 
10PIC700422.PV 10-PSV-700073A 10-PSV-700073B 2016-09-09 10:44:10.000 2016-09-09 10:49:40.000 Big Small 
10PIC700422.PV 10-PSV-700073A 10-PSV-700073B 2016-09-09 10:50:03.000 2016-09-09 10:51:04.000 Small Small 
11PIC41010.PV 11-PSV-401002A 11-PSV-401002B  2016-04-04 12:51:07.000 2016-04-04 13:58:09.000 Big Small 
11PIC41010.PV 11-PSV-401002A 11-PSV-401002B  2016-04-04 14:04:04.000 2016-04-04 14:29:00.000 Small Small 
11PIC41010.PV 11-PSV-401002A 11-PSV-401002B  2016-04-04 14:51:02.000 2016-04-04 14:58:00.000 Big Small 
11PIC41010.PV 11-PSV-401002A 11-PSV-401002B  2016-04-04 15:04:06.000 2016-04-04 15:29:08.000 Small Small 
11PIC41010.PV 11-PSV-401002A 11-PSV-401002B  2016-04-04 15:45:08.000 2016-04-04 15:55:09.000 Big Big 
11PIC41010.PV 11-PSV-401002A 11-PSV-401002B  2016-04-04 16:22:08.000 2016-04-04 16:40:09.000 Big Small 
11PIC41010.PV 11-PSV-401002A 11-PSV-401002B  2016-04-04 16:50:04.000 2016-04-04 16:55:00.000 Small Small 
11PIC41010.PV 11-PSV-401002A 11-PSV-401002B  2016-04-04 17:05:02.000 2016-04-04 17:20:00.000 Big Small 
11PIC41010.PV 11-PSV-401002A 11-PSV-401002B  2016-04-04 17:22:06.000 2016-04-04 17:29:08.000 Small Small 
11PIC41010.PV 11-PSV-401002W 11-PSV-401002D  2016-04-04 16:04:01.000 2016-04-04 16:45:00.000 Big Big 

前回終了日よりも遅いendtimeおよびendtimeはstarttimeよりも1秒遅れています。 dはTag_newは "悪い" です:

Small 
Big 
Small 

私は以下のようなものを取得したいのですが:このデザインは匂い

         Event Start     End      Tag Tag_new 
10PIC700422.PV 10-PSV-700073A 10-PSV-700073B 2016-09-09 10:44:05.000 2016-09-09 10:48:08.000 Big Big 
10PIC700422.PV 10-PSV-700073A 10-PSV-700073B 2016-09-09 10:44:10.000 2016-09-09 10:49:40.000 Big Small 
10PIC700422.PV 10-PSV-700073A 10-PSV-700073B 2016-09-09 10:50:03.000 2016-09-09 10:51:04.000 Small Small 
11PIC41010.PV 11-PSV-401002A 11-PSV-401002B  2016-04-04 12:51:07.000 2016-04-04 13:58:09.000 Big Small 
11PIC41010.PV 11-PSV-401002A 11-PSV-401002B  2016-04-04 14:04:04.000 2016-04-04 14:29:00.000 Small Small 
11PIC41010.PV 11-PSV-401002A 11-PSV-401002B  2016-04-04 14:29:01.000 2016-04-04 14:29:02.000 Bad Bad 
11PIC41010.PV 11-PSV-401002A 11-PSV-401002B  2016-04-04 14:51:02.000 2016-04-04 14:58:00.000 Big Small 
11PIC41010.PV 11-PSV-401002A 11-PSV-401002B  2016-04-04 15:04:06.000 2016-04-04 15:29:08.000 Small Small 
11PIC41010.PV 11-PSV-401002A 11-PSV-401002B  2016-04-04 15:45:08.000 2016-04-04 15:55:09.000 Big Big 
11PIC41010.PV 11-PSV-401002A 11-PSV-401002B  2016-04-04 16:22:08.000 2016-04-04 16:40:09.000 Big Small 
11PIC41010.PV 11-PSV-401002A 11-PSV-401002B  2016-04-04 16:50:04.000 2016-04-04 16:55:00.000 Small Small 
11PIC41010.PV 11-PSV-401002A 11-PSV-401002B  2016-04-04 16:55:01.000 2016-04-04 16:55:02.000 Bad Bad 
11PIC41010.PV 11-PSV-401002A 11-PSV-401002B  2016-04-04 17:05:02.000 2016-04-04 17:20:00.000 Big Small 
11PIC41010.PV 11-PSV-401002A 11-PSV-401002B  2016-04-04 17:22:06.000 2016-04-04 17:29:08.000 Small Small 
11PIC41010.PV 11-PSV-401002W 11-PSV-401002D  2016-04-04 16:04:01.000 2016-04-04 16:45:00.000 Big Big 
+0

私はこの質問を投票しました。質問は大丈夫です。コピーアンドペースト、自分の努力、そして非常に明確な説明のサンプルコードがあります。全体のアプローチはちょっと匂いがあり、複雑です - SQL Serverはこのための最良のツールではないかもしれません。しかし、問題自体は、「不透明なために閉じる」にもふさわしいものでもなく、下位投票にふさわしいものでもない。ちょうど私の2セント... – Shnugo

+0

ありがとうございましたShnugoが投票しました –

+0

なぜこの質問を再投稿しましたか?ここで答えられました:http://stackoverflow.com/questions/40026002/group-and-order-with-additional-exception/40027420#40027420? – iamdave

答えて

1

が、あなたはこのような何か試してみてください:あなたがすべき

を文化特有の日時リテラルを避けてください!

Declare @YourTable table ([Event] varchar(100),[Start] DateTime,[End] DateTime, [Tag] varchar(25)) 
Insert Into @YourTable values 
('10PIC700422.PV 10-PSV-700073A 10-PSV-700073B','9/9/16 10:44:05.000','9/9/16 10:48:08.000','Big'), 
('10PIC700422.PV 10-PSV-700073A 10-PSV-700073B','9/9/16 10:44:10.000','9/9/16 10:49:40.000','Big'), 
('10PIC700422.PV 10-PSV-700073A 10-PSV-700073B','9/9/16 10:50:03.000','9/9/16 10:51:04.000','Small'), 
('11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4/4/16 12:51:07.000','4/4/16 13:58:09.000','Big'), 
('11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4/4/16 14:04:04.000','4/4/16 14:29:00.000','Small'), 
('11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4/4/16 14:51:02.000','4/4/16 14:58:00.000','Big'), 
('11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4/4/16 15:04:06.000','4/4/16 15:29:08.000','Small'), 
('11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4-4-16 15:45:08.000','4-4-16 15:55:09.000','Big'), 
('11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4-4-16 16:22:08.000','4-4-16 16:40:09.000','Big'), 
('11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4/4/16 16:50:04.000','4/4/16 16:55:00.000','Small'), 
('11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4/4/16 17:05:02.000','4/4/16 17:20:00.000','Big'), 
('11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4/4/16 17:22:06.000','4/4/16 17:29:08.000','Small'), 
('11PIC41010.PV 11-PSV-401002W 11-PSV-401002D','4/4/16 16:04:01.000','4/4/16 16:45:00.000','Big'); 

--addクエリを実行中の行番号と列を検出するために、すべてのoriginal

WITH YourQueryEnhanced AS 
(
    Select [Event] 
    ,[Start] 
    ,[End] 
    ,[Tag] 
    ,[Tag_new] = case when Tag='Big' and 'Small' = Lead(Tag,1,Tag) over (Partition By [Event] Order By Start) then 'Small' else tag end 
    ,ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS SortInx --You should put a secure ORDER BY here!!! 
    ,0 AS InnerSortInx 
    From @YourTable 
) 

--use LAG()ため0。重複している不良シーケンスには1つの問題があります。

,BadMarked AS 
(
    SELECT * 
     ,CASE WHEN LAG([Tag],1) OVER(Order By SortInx)='Small' 
       AND LAG([Tag],2) OVER(Order By SortInx)='Big' 
       AND LAG([Tag],3) OVER(Order By SortInx)='Small' THEN 1 ELSE 0 END AS BadSequence 

    FROM YourQueryEnhanced 
) 

- このすべてoriginal行を選択し、BadSequenceとしてマークされた行ごとにbad行を追加します。 SortInxを前の値に設定され、インナーsortInxは

SELECT * 
    FROM BadMarked 

    UNION ALL 

    SELECT [Event],[Start],[End],'Bad','Bad',SortInx-1,1,2 
    FROM BadMarked 
    WHERE BadMarked.BadSequence=1 
    ORDER BY SortInx,InnerSortInx 

注意

これはもう一つの不良行が追加され、従ってORDER BYが適切な場所にbad行に押され、1に設定されています期待通りの結果が得られました。

なぜなら、あなたのラインは3から7です。なぜなら、あなたは小さな小さなものから小さなものまで持っているからです。真ん中のsmallは両方の配列に属します。

あなたが悪いシーケンスが検出された場所(LAG()へのより多くの呼び出しがさらに振り返るために)、でより多くのロジックでこれを解決しなければならないのいずれか、またはあなたが1よりCTEとして最後の選択をラップし、悪い削除するには、再びLAG()を使用あなたが望まない行。

+0

Shnugo、コードありがとうございますが、これは私が必要ではないようです。 –

+0

@JoeGreen、詳しく教えてください...どうしてですか? – Shnugo

+0

OK、私は追加の行を処理しようとします(まだそれを行う方法がわかりません)、開始時間と終了時間に1秒を追加するとどうなりますか? –

1

@ Shnugo:あなたは本当に近くでした。ソリューションをありがとう!

WITH YourQueryEnhanced AS 
(
Select [Event] 
,[Start] 
,[End] 
,[Tag] 
,[Tag_new] = case when Tag='Big' and 'Small' = Lead(Tag,1,Tag) over (Partition By [Event] Order By Start) then 'Small' else tag end 
,ROW_NUMBER() OVER(Partition By [Event] Order By Start) AS SortInx --You  should put a secure ORDER BY here!!! 
,0 AS InnerSortInx 
From @YourTable 
), BadMarked AS 
(
SELECT * 
    ,CASE WHEN LAG([Tag],1) OVER(Order By SortInx)='Small' 
      AND LAG([Tag],2) OVER(Order By SortInx)='Big' 
      AND LAG([Tag],3) OVER(Order By SortInx)='Big' THEN 1 ELSE 0 END  AS BadSequence 
FROM YourQueryEnhanced 
) 
select * from 
(
SELECT * 
FROM BadMarked 
UNION ALL 
    SELECT [Event],DATEADD(s, -1, [Start]) [Start], [End],'Bad','Bad',SortInx-1,1,2 
FROM BadMarked 
WHERE BadMarked.BadSequence=1 
) a order by [Event] 
,[Start] 
+0

こんにちは、私は "受け入れ"ボタンを見つけることができません。 –

+0

がそれを受け入れました。もう一度ありがとうShnugo !! –