2016-05-11 12 views
3

[OK]を、ここに私の状況です。以前のDBスペシャリスト(SQL Server 2008)は、パフォーマンス目的のために時間を格納するテーブルを設定しました。時刻はVBスクリプトから生成され、テーブルに入力されます。計算時間が

演奏処理(表中:下から上へ): - >時間を文書化

  • (オープン2)窓(2現れる

    • (オープン1)メニューから、(1)を選択します) - >時間
    • が(1を選択)入り、口座番号とプレス '検索' は(3)文書化 - データが表示されたときに>(2を選択)
    • 時間を文書化 - >時間を文書化(4)

    Msrmnt | Time     | Window  | Function | Position 
    --------+-------------------------+------------+----------+----------- 
    109  | 2016-05-10 20:35:32.243 | WindowName | Select | 2 
    109  | 2016-05-10 20:35:29.230 | WindowName | Select | 1 
    109  | 2016-05-10 20:35:26.697 | WindowName | Open  | 2  
    109  | 2016-05-10 20:35:23.297 | WindowName | Open  | 1 
    

    今、Iは2つの開放値(1 & 2)との間の時間(例えば)を計算する必要があります。私は計算が時間に関する効率的です)DBの持つ多くの経験を持っていますが、私は、私は、この私が1だ確認するために)正確な結果を得るため、2最善のアプローチをすべきかに引っかかっています(多くのエントリー内であるとして週時間)2時間値の間で計算された時間を取得するためにどのように任意の提案のための

    おかげ

    カレン

  • +1

    自分自身でテーブルを自分自身に参加させ、次に2つの時間カラムを使用できます。 –

    +0

    もし 'Open'値で作業していて、' Select'値を無視しているのであれば、* single *以上の例がありますか?また、期待される*結果が何であるかを示すことができます。私たちは、行のペアを関連付けるにはどうすればよい(与えられた 'Msrmnt'値についてのみ、これまで2' Open'行があるのですか?)あなたの答えのための –

    答えて

    2

    基本的な例:

    ;WITH cte AS (
    SELECT * 
    FROM (VALUES 
    (109, '2016-05-10 20:35:32.243', 'WindowName', 'Select', 2), 
    (109, '2016-05-10 20:35:29.230', 'WindowName', 'Select', 1), 
    (109, '2016-05-10 20:35:26.697', 'WindowName', 'Open', 2), 
    (109, '2016-05-10 20:35:23.297', 'WindowName', 'Open', 1) 
    ) as t (Msrmnt, [Time], Window, [Function], Position) 
    ) 
    
    SELECT c.Msrmnt, 
         c.Window, 
         DATEDIFF(MILLISECOND,c.[Time],c1.[Time]) as ms 
    FROM cte c 
    INNER JOIN cte c1 
        ON c.Msrmnt = c1.Msrmnt 
         AND c.Window = c1.Window 
         AND c.[Function] = c1.[Function] 
         AND c.Position + 1= c1.Position 
    WHERE c.[Function] = 'Open' 
    

    出力:

    SQL 2008年の日付順に
    Msrmnt  Window  ms 
    ----------- ---------- ----------- 
    109   WindowName 3400 
    
    +0

    HIのgofrのおかげで。 。 。私はあなたのソリューションを実装しようとしましたが、実際には、測定値が何であるかを「知る」ことができません(109:これは109番目の測定値です)。 。 。私はウィンドウを知ることができますが(むしろそうではないでしょう)、機能と位置(@Damien ...すべての関数が適用されますが、他にもありますが、これは単なる例です)。 。 。例えば、測定(c.msrmnt = c1.msrmnt)、ウィンドウ(c.window = c1.window)、および関数(c.function = c1.function)。 。 。それでもこの方法を使用できますか? – kalmeida

    +0

    私は '測定'と 'オープン'ウィンドウの間にのみ必要と仮定し、どのウィンドウとその位置が重要ではありません。私は正しい?もしそうなら、答えは非常にあります。 – gofr1

    +0

    はい、あなたはそれを使うことができますが、先ほど言いましたが、特定のウィンドウと位置が不要な場合はクエリが変わる – gofr1

    2

    ベースのプラットフォームでは、これはLEADまたはLAGの関数とすることができるSQL 2012の場合。

    ;WITH X AS (
    
    SELECT 109 AS Msrmnt, CAST('2016-05-10 20:35:32.243' AS DATETIME) As Date, 'WindowName' AS Window, 'Select' AS [Function], 2 AS Position UNION ALL 
    SELECT 109,CAST('2016-05-10 20:35:29.230' AS DATETIME),'WindowName' , 'Select',1 UNION ALL 
    SELECT 109,CAST('2016-05-10 20:35:26.697' AS DATETIME),'WindowName','Open',2  UNION ALL 
    SELECT 109,CAST('2016-05-10 20:35:23.297' AS DATETIME),'WindowName','Open',1 
    ) 
    SELECT 
    DATEDIFF(S,x1.Date, x2.Date) 
    ,x1.Date, x2.Date 
    FROM x as x1 
    INNER JOIN x as x2 
        ON x1.Msrmnt = x2.Msrmnt AND x1.Window = x2.Window AND x1.Date < x2.Date 
    WHERE x1.[Function] = 'Open' AND x2.[Function] = 'Open' 
    
    1

    [OK]を、私はこのようにそれを解決しました。 。 。

    Select t.ZP1, t.Form1, t.ZP2, t.Form2, DATEDIFF(MILLISECOND,t.ZP1,t.ZP2) as ms 
    From 
    (Select p1.time as ZP1, p1.window as Form1, p2.time as ZP2, p2.window as Form2 
    from tpermonitor p1 LEFT JOIN 
    tpermonitor p2 On 
    p2.msrmnt = p1.msrmnt 
    and p2.Funktion = 'open' 
    and p2.Position = 2 and p2.System = 'mysys' 
    and p2.time Between '05.04.2016' and '05.13.2016' 
    and p2.window = p1.window and p2.msrmnt = p1.msrmnt 
    where p1.System like 'mysys' 
    and p1.time Between '05.04.2016' and '05.13.2016' 
    and p1.Position = 1 
    and p1.Funktion like 'Open' 
    and CAST(p2.time as DATE) = CAST(p1.time as DATE)) as t 
    Order by t.ZP1 
    

    私はそれはきれいなソリューションですわからないんだけど、それが動作します。将来的にはより洗練されたソリューションで動作しますが、当面はこれで作業します。

    誰でもコメントしたい場合は、私が開いています。 。 。

    あなたのフィードバックをお寄せいただきありがとうございます。