プロセスセットポイントとプロセス値(PV)のテーブルがあります。
以下の表のようなもの:
Timestamp Setpoint PV
--------- --------- -------------
t1 100 125
t2 100 95 *
t3 100 98
t4 100 88
t5 100 105
t6 100 59 *
t7 100 90
t8 100 101
t9 100 70 *
t10 100 101
私がやりたいのは、PVが設定値を下回り、設定値を上回った回数をカウントする結果として1つの行を作成するクエリです。また、設定値を下回った期間を計算します。
結果は次のようになります。
NumberofOccurance Duration
------------------ ---------
3 (t5-t2)+(t8-t6)+(t10-t9)
注:正しい発生数は、この場合は6ではなく3であり、最も難しい部分は期間を実行することだと思います。
何か案は?
前もって感謝します
編集:以下にいくつかの良い答えがありますが、複数のPVがある場合はどうでしょうか(実際には、PVごとに10の異なるPVが別々の列にあり、2つのセットポイントが2つの別々の列にあります(セットポイントは20列です)。すべてが1つのテーブルにあります。1秒間隔のタイムスタンプ。すべてのPVに対して同じクエリを実行する方法はありますか?以下のカーソルとCTEオプションを組み合わせた動的SQLについて考えていますが、それは非常に困難です。
長くて醜いですが、それは機能します
CREATE TABLE MyTable
(
TimeSt INT,
SetPoint INT,
PV INT
)
INSERT INTO MyTable
VALUES (1, 100, 122),
(2, 100, 95),
(3, 100, 98),
(4, 100, 88),
(5, 100, 105),
(6, 100, 59),
(7, 100, 90),
(8, 100, 101),
(9, 100, 70),
(10, 100, 101);
WITH CTE
AS (SELECT
*
,lag(TimeSt, 1) OVER(ORDER BY TimeSt) AS LagTimeSt
,lag(SetPoint, 1) OVER(ORDER BY TimeSt) AS LagSetPoint
,lag(PV, 1) OVER(ORDER BY TimeSt) AS LagPV
FROM
MyTable),
CTE2
AS (SELECT
*
,CASE
WHEN (PV < SetPoint AND LagPV > LagSetPoint)
THEN 1 ELSE 0 END AS FirstDrop
FROM
CTE
WHERE
(PV < SetPoint AND LagPV > LagSetPoint)
OR (PV > SetPoint AND LagPV < LagSetPoint)),
CTE3
AS (SELECT
Lead(timest) OVER(ORDER BY TimeSt) UpTime
,*
FROM
CTE2)
SELECT
sum(firstDrop) AS Occur
,sum(uptime - Timest) AS DownTime
FROM
CTE3
Where FirstDrop = 1
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加