2016-05-19 5 views
1

私はWin7マシンでMSSMS 2008 R2を使用しています。パス/フェイルフィールドに基づいて行間の中間日時値を削除して、各サブグループの最初と最後の合否を取得する方法。

enter image description here

各行は、パス/フェイルイベントを表します。私はいくつかの基本的なクエリの後に引っ張られ、このデータのテーブルを持っています。合格= TPSDおよび失敗= TFLT;私はの間にデルタを取得しようとしています。の初期TFLTと最新のTPSD(TFLT後の最初のTPSD)です。私の最初のアプローチは、データが連続して注文したときに正常に動作され、このことROW_NUMBER()関数を使用して、各行のエントリを列挙しました:

WITH ROWS AS 
    (
    SELECT *, ROW_NUMBER() OVER (Order BY T.Location, T.BIT_TIME) AS RN 
    FROM #TEMP1 T 
    ) 
SELECT DATEDIFF(SECOND, R1.BIT_TIME, R2.BIT_TIME) 
FROM ROWS R1 
JOIN ROWS R2 
on R1.RN = R2.RN - 1 
AND R1.EventId = 'TFLT' 
AND R2.EventId = 'TPSD' 
AND R1.Location = R2.Location 

をしかし、私は思ったように、データセットが構成されていなかった実現した後、私は壁にぶつかります。どんな助けもありがとう。前もって感謝します。

これはテーブルのサンプルで、複数の場所/ログIDがあり、大部分は連続してTFLT、TPSD、TFLT、TPSDなどのように構成されています。

- Stelio K

+0

に(T.Location、T.BIT_TIME BY注文)OVER ROW_NUMBER()を変更してみてくださいROW_NUMBER()OVER(T.Location Order BY T.BIT_TIMEによるパーティション) – Kostya

+0

選択したDATEDIFF(SECOND、R1.BIT_TIME、R2.BIT_TIME) select *、ROW_NUMBER()OVER(T.Location Order BY T .BIT_TIME asc)AS RN)x join(select *、ROW_NUMBER()OVER(T.Location Order by BY T.BIT_ X.RN = y.RN およびx.Location = y.Location およびy.EventId = 'TFLT' 上のx.EventId = 'TPSD'およびx.RN = 1 – Kostya

+0

上の あなたがしようとしているものをSQLのフィドルにすることができれば、それはクールです。他の人が遊ぶのが楽になります。 http://sqlfiddle.com/ – Shiroy

答えて

0

私は完全に私の答えを書き換えます。私はそのような何のいずれかのIDが存在しない場合に役立ちますROW_NUMBER() OVER (ORDER BY (SELECT 1))として有用であることについて思い出し:

;WITH final AS (
SELECT LogID, 
     [Location], 
     BIT_TIME, 
     EventId, 
     BitId, 
     ROW_NUMBER() OVER (Order BY (SELECT 1)) AS RN 
FROM TEMP1 T 
) 

SELECT r.BIT_TIME, 
     r.EventId, 
     r.BIT_TIME1, 
     r.EventId1, 
     DATEDIFF(SECOND,r.BIT_TIME,r.BIT_TIME1) as Sec 
FROM (
    SELECT t.BIT_TIME, 
      t.EventId, 
      CAST(tq.BIT_TIME as datetime) as BIT_TIME1, 
      tq.EventId as EventId1, 
      ROW_NUMBER() OVER (PARTITION BY t.EventId, tq.BIT_TIME ORDER BY t.BIT_TIME ASC) as rn 
    FROM final t 
    OUTER APPLY (
     SELECT top 1 * 
     FROM final t1 
     WHERE t1.EventId = 'TPSD'and t.BIT_TIME<= t1.BIT_TIME and t.EventId != t1.EventId and t.RN < t1.RN 
     ) as tq 
    WHERE t.EventId = 'TFLT' 
    ) as r 
WHERE rn = 1 
ORDER BY BIT_TIME 

出力:

BIT_TIME    EventId BIT_TIME1    EventId1 Sec 
2015-11-29 19:29:42.000 TFLT 2015-11-29 19:30:12.000 TPSD  30 
2015-11-29 19:30:33.000 TFLT 2015-11-29 19:30:35.000 TPSD  2 
2015-11-29 19:30:36.000 TFLT 2015-11-29 19:30:52.000 TPSD  16 
2015-11-29 19:30:53.000 TFLT 2015-11-29 19:30:59.000 TPSD  6 
2015-11-29 19:31:02.000 TFLT 2015-11-29 19:31:09.000 TPSD  7 
2015-11-29 19:31:53.000 TFLT 2015-11-29 19:31:56.000 TPSD  3 
2015-11-29 19:32:13.000 TFLT 2015-11-29 19:32:47.000 TPSD  34 
2015-11-29 19:32:48.000 TFLT 2015-11-29 19:32:57.000 TPSD  9 
2015-11-29 19:32:57.000 TFLT 2015-11-29 19:33:17.000 TPSD  20 
2015-11-29 19:33:18.000 TFLT 2015-11-29 19:33:24.000 TPSD  6 
2015-11-29 19:34:13.000 TFLT 2015-11-29 19:35:15.000 TPSD  62 
2015-11-29 19:35:16.000 TFLT 2015-11-29 19:35:19.000 TPSD  3 
2015-11-29 19:35:22.000 TFLT 2015-11-29 19:35:53.000 TPSD  31 
2015-11-29 19:35:54.000 TFLT NULL     NULL  NULL 
+0

簡潔でエレガントな答えを提供するために時間を割いてくれてありがとうございました。残念ながら、あなたが提供した "query"ブロックは、主にt.rn StelioK

+0

IDカラムがある場合、2番目の答えの部分(スクリプトの最初からテーブル/ cteを作成する)は便利です。私は1つを作成しました。手動で各行に1〜40の数字を手動で追加しました。 – gofr1

+0

私は質問:あなたの答えの一部を指していました。 – StelioK

関連する問題