2

分析関数を使用して、これらのレコードをこれから折りたたむことができますか?

ssid  start_time            end_time                op_code
65F   08/JAN/2013 14:18:33  08/JAN/2013 14:18:34    2
65F   08/JAN/2013 14:18:53  08/JAN/2013 14:18:54    2
65F   08/JAN/2013 14:18:55  08/JAN/2013 14:18:59    3
65F   08/JAN/2013 14:19:33  08/JAN/2013 14:19:34    2
65F   08/JAN/2013 14:19:53  08/JAN/2013 14:19:54    2
65F   08/JAN/2013 14:19:55  08/JAN/2013 14:19:59    3
72F   08/JAN/2013 14:20:55  08/JAN/2013 14:20:56    2
72F   08/JAN/2013 14:19:57  08/JAN/2013 14:19:59    2

これに

ssid  start_time            end_time              c_dt                 op_code
65F   08/JAN/2013 14:18:33  08/JAN/2013 14:18:54  08/JAN/2013 14:18:59   2
65F   08/JAN/2013 14:19:33  08/JAN/2013 14:19:54  08/JAN/2013 14:19:59   2
72F   08/JAN/2013 14:19:57  08/JAN/2013 14:20:56

または、これを for ループのみで処理する必要があります。私はOracle 11gR2を使用しています

次の op_code が 2 の場合、end_time は次のレコードの end_time になり、op_code 3 の同じ ssid が到着するまで、このレコードの終了時刻を置き換え続けます。op_code 3 のレコードが到着すると、ssid は同じで op_code 3 のレコードの end_time である c_dt を生成します。次のレコードに対してこのプロセスを最初からやり直します。

特定の ssid の op_code 3 を持つレコードが見つからない場合、c_dt は null になりますが、end_time は同じ ssid を持つ次のレコードの end_time になります。

このトリッキーなロジックが明確であることを願っています

4

1 に答える 1

2

私はこれがきれいではないと最初に言うでしょう、しかしそれはあなたを正しい方向に向かわせるはずです。

まず、対応する行番号を持つすべてのレコードを使用してCTEを作成します。

次に、オペコードが同じではない次のレコードを持つ別のCTEを作成します。

3番目に、最小行番号、最大行番号、および次の行番号(潜在的にnull)を持つ別のCTEを作成し、これを使用して結果を取得します。

それは非常に簡単にすることができましたが、これは私の最初の試みでした。

WITH CTE AS (
  SELECT 
     t.ssid,t.start_time,t.end_time,t.op_code
    ,ROW_NUMBER() OVER (ORDER BY Start_Time) rn
  FROM YourTable t
) , 
CTE2 AS (
  SELECT C.SSID, C.RN, MIN(C2.RN) RN2
  FROM CTE C
    LEFT JOIN CTE C2 ON 
      C.RN < C2.RN AND 
      C.OP_CODE <> C2.OP_CODE AND 
      C.SSID = C2.SSID
  WHERE C.Op_Code = 2
  GROUP BY C.SSID, C.RN
) ,
CTE3 AS (
  SELECT SSID, MIN(RN) MinRN, MAX(RN) MaxRN, RN2 
  FROM CTE2
  GROUP BY SSID, RN2
) 
SELECT c.ssid, 
  c.start_time, 
  c3.end_time, 
  c4.end_time c_dt, 
  c.op_code
FROM CTE c
   JOIN CTE3 c2 ON c.RN = c2.MinRN
   JOIN CTE c3 ON c2.MaxRN = c3.RN
   LEFT JOIN CTE c4 ON c2.RN2 = c4.RN

そして、これがSQLFiddleです。

幸運を。

于 2013-02-04T04:45:03.303 に答える