1

このようなテーブルからの情報を表示するクエリがあります。

SELECT tag.label, inputs.input_raw, inputs.unix_timestamp, tag.inverted FROM inputs 
JOIN tag 
ON tag.tag_id = inputs.tag_id
WHERE (inputs.tag_id = 92084)

AND (inputs.date_time > dateadd(day,-1,getdate()))  
ORDER BY date_time DESC

ここに画像の説明を入力

2 つのことを行うクエリを書きたいと思います。

input_raw が「0」から「1」に切り替わるたびにカウントが必要です。

unix_timestamp を使用して、ポンプの合計実行時間も必要です。input_raw = 1 の場合。

誰にもアイデアはありますか。

私は必要な結果を得るために php を使用するアルゴリズムに落ち着きますが、私はレンガの壁にぶつかり、それを理解することができませんでした.

ありがとう

編集: テーブルには、使用できる date_time メソッドがある場合、unix_timestamp の値に一致する date_time フィールドも含まれています>

4

1 に答える 1

3

Leador関数を使用してLag、現在の結果を前または次の結果と比較します。ただし、これらの関数は SQL Server 2012 で導入されました。

pinaldave 氏の助けを借りて、0 から 1 までのすべての変更をカウントする次のSQL Fiddleを作成することができました。

;WITH x AS 
(
  SELECT
    1 AS ldOffset, -- equiv to 2nd param of LEAD
    1 AS lgOffset, -- equiv to 2nd param of LAG
    NULL AS ldDefVal, -- equiv to 3rd param of LEAD
    NULL AS lgDefVal, -- equiv to 3rd param of LAG
    ROW_NUMBER() OVER (ORDER BY unix_timestamp) AS row,
    label,
    input_raw,
    unix_timestamp,
    inverted
  FROM inputs
 )
SELECT 
    COUNT(1)
FROM x
LEFT OUTER JOIN x AS xLg 
  ON x.row = xLg.row + x.lgOffset
WHERE xLg.input_raw = 0 AND x.input_raw = 1;

同じ関数を使用してLag、現在のタイムスタンプと前のタイムスタンプの差を計算できます。

編集:

この SQL Fiddleは、ポンプが実行されている合計時間を取得する方法を示す必要があります (running自分で定義する必要があります。このクエリは、0 から 1 に移動するか、1 のままでいることが実行されていることを前提としています。また、タイムスタンプの計算を再確認する必要があります。 'これまで unix タイムスタンプを使用したことがありません。

;WITH x AS 
(
  SELECT
    1 AS ldOffset, -- equiv to 2nd param of LEAD
    1 AS lgOffset, -- equiv to 2nd param of LAG
    NULL AS ldDefVal, -- equiv to 3rd param of LEAD
    NULL AS lgDefVal, -- equiv to 3rd param of LAG
    ROW_NUMBER() OVER (ORDER BY unix_timestamp) AS row,
    label,
    input_raw,
    unix_timestamp,
    inverted
  FROM inputs
 )
SELECT 
    SUM(DATEDIFF(mi, 
             DATEADD(ss, xLg.unix_timestamp,'01/01/1970'), 
             DATEADD(ss, x.unix_timestamp,'01/01/1970')))  
FROM x
LEFT OUTER JOIN x AS xLg 
  ON x.row = xLg.row + x.lgOffset
WHERE 
  (xLg.input_raw = 0 AND x.input_raw = 1)
OR
  (xLg.input_raw = 1 AND x.input_raw = 1);

編集2:

反転を確認する最も簡単な方法は、WHERE句を次のように変更することだと思います。

WHERE 
  (x.inverted = 1 AND xLg.input_raw = 0 AND x.input_raw = 1)
OR
  (x.inverted = 0 AND xLg.input_raw = 1 AND x.input_raw = 0)
于 2013-03-14T21:27:39.250 に答える