SQL Server 2012:動的SQLを使用して、発生回数を取得し、期間を計算します

フレディ

プロセスセットポイントとプロセス値(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について考えていますが、それは非常に困難です。

RegBes

長くて醜いですが、それは機能します

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]

編集
0

コメントを追加

0

関連記事

分類Dev

SQL Server:関数を使用して新しい列を計算します

分類Dev

SQL Server-結合を使用してAVG()を計算します

分類Dev

SQL Server 2012を使用して、不明な数の行を反復処理し、日付の差を計算する方法

分類Dev

SQL Server2012の計算列を平均として指定します

分類Dev

SQL Server2000を使用して最大試行回数を取得します

分類Dev

SQL Serverは、年、四半期、月の市場シェアを計算します

分類Dev

SQL Serverは、ウィンドウ関数を使用してAVG()を計算します

分類Dev

SQL Server 2012を使用していますが、正常に機能しています。しかし、SQL Server2008とそれは機能していません。クエリを実行しているときに、次のエラーが発生します。

分類Dev

SQL Server2008でテーブル変数を使用して動的SQLクエリを実行中にエラーが発生しました

分類Dev

SQL Server:合計関数が間違った値を返しています

分類Dev

SQL Serverの2つの行を比較して、列間の平均を計算します

分類Dev

Microsoft SQLを使用して期間を計算する方法は?

分類Dev

SQL Server 2012を使用してクエリに月次累計と年初来を追加しますか?

分類Dev

SQL Server2012の2つの時間の差を取得します

分類Dev

SQL Server2008で時間差を分単位で計算します

分類Dev

ウィンドウ関数を使用して移動合計/平均を計算するときの動的行範囲(SQL Server)

分類Dev

SQL Server 2012:同じデータセット内で数式ベースの列を使用して計算列を作成する方法は?

分類Dev

SQL Serverピボットは、行を計算して列に変換します

分類Dev

SQL Server 2012で空間インデックスを使用してSTDistanceを使用すると、COS、SIN、およびACOS計算を使用するよりも時間がかかり、楕円形の結果が得られます。

分類Dev

SQL Server2012 +で連続する期間の最小開始と最大終了を選択します

分類Dev

SQL Server2008を使用してVisualStudio2012で@@ identityを取得する方法

分類Dev

SQL Server:さまざまな容量期間の就寝日数を計算する方法

分類Dev

SQL Server行を日時でグループ化し、カウントを使用して合計を取得します

分類Dev

SQL Server2012のWeekDay整数からWeekDay名を取得します

分類Dev

SQL Server:OVER / Partitionを使用して、分(または時間間隔)でレコードを取得します

分類Dev

SQL Server2012を使用してSMSを送信する

分類Dev

SQL Server2012-クエリのパーセンテージを示す計算列を作成します

分類Dev

SQL Server:ログインおよび/またはログアウトを使用して実行時間を計算します

分類Dev

SQL Server2008でgroupbyとorderbyを使用して結果を取得するときにエラーが発生しました

Related 関連記事

  1. 1

    SQL Server:関数を使用して新しい列を計算します

  2. 2

    SQL Server-結合を使用してAVG()を計算します

  3. 3

    SQL Server 2012を使用して、不明な数の行を反復処理し、日付の差を計算する方法

  4. 4

    SQL Server2012の計算列を平均として指定します

  5. 5

    SQL Server2000を使用して最大試行回数を取得します

  6. 6

    SQL Serverは、年、四半期、月の市場シェアを計算します

  7. 7

    SQL Serverは、ウィンドウ関数を使用してAVG()を計算します

  8. 8

    SQL Server 2012を使用していますが、正常に機能しています。しかし、SQL Server2008とそれは機能していません。クエリを実行しているときに、次のエラーが発生します。

  9. 9

    SQL Server2008でテーブル変数を使用して動的SQLクエリを実行中にエラーが発生しました

  10. 10

    SQL Server:合計関数が間違った値を返しています

  11. 11

    SQL Serverの2つの行を比較して、列間の平均を計算します

  12. 12

    Microsoft SQLを使用して期間を計算する方法は?

  13. 13

    SQL Server 2012を使用してクエリに月次累計と年初来を追加しますか?

  14. 14

    SQL Server2012の2つの時間の差を取得します

  15. 15

    SQL Server2008で時間差を分単位で計算します

  16. 16

    ウィンドウ関数を使用して移動合計/平均を計算するときの動的行範囲(SQL Server)

  17. 17

    SQL Server 2012:同じデータセット内で数式ベースの列を使用して計算列を作成する方法は?

  18. 18

    SQL Serverピボットは、行を計算して列に変換します

  19. 19

    SQL Server 2012で空間インデックスを使用してSTDistanceを使用すると、COS、SIN、およびACOS計算を使用するよりも時間がかかり、楕円形の結果が得られます。

  20. 20

    SQL Server2012 +で連続する期間の最小開始と最大終了を選択します

  21. 21

    SQL Server2008を使用してVisualStudio2012で@@ identityを取得する方法

  22. 22

    SQL Server:さまざまな容量期間の就寝日数を計算する方法

  23. 23

    SQL Server行を日時でグループ化し、カウントを使用して合計を取得します

  24. 24

    SQL Server2012のWeekDay整数からWeekDay名を取得します

  25. 25

    SQL Server:OVER / Partitionを使用して、分(または時間間隔)でレコードを取得します

  26. 26

    SQL Server2012を使用してSMSを送信する

  27. 27

    SQL Server2012-クエリのパーセンテージを示す計算列を作成します

  28. 28

    SQL Server:ログインおよび/またはログアウトを使用して実行時間を計算します

  29. 29

    SQL Server2008でgroupbyとorderbyを使用して結果を取得するときにエラーが発生しました

ホットタグ

アーカイブ