0

SQL サーバー 2012 の使用

これら 2 つのクエリを考え出して、必要なものの両方を取得することはできますが、それらを組み合わせて 1 つの結果テーブルを取得する方法がわかりません。

--Returns Max Value of instrument per day
Declare @StDate DateTime
Declare @EndDate DateTime
Set @STDate = '11/1/2012'
Set @EndDate = '12/1/2012'
Select dateadd(day,(datediff(day,0,TIMEandDATE)),0) as MyDate, MAX(Value) AS Max_Turb 
From Turbs where TagID = 3004
and TimeAndDate >= @StDate
and TimeAndDate < @EndDate
Group by dateadd(day,(datediff(day,0,TIMEandDATE)),0)
Order by dateadd(day,(datediff(day,0,TIMEandDATE)),0)

--returns when the process line status bit changes to On_Line
Declare @StDate DateTime
Declare @EndDate DateTime
Set @STDate = '11/1/2012'
Set @EndDate = '12/1/2012'
SELECT TIMEandDATE as MyDate, Value as On_Line
  FROM StatusBits
  Where TagID = 10003
  and Value = 1
  and TimeAndDate >= @StDate
and TimeAndDate < @EndDate

TagID 10003 は終日読み込まれるわけではなく、状態が変化したときにのみログに記録され、タイム スタンプが付けられます。

TagID 3004 は、他に関係なく 1 日中ログに記録されます。このため、無意味な値がログに記録されます。TagID 10003 ビットは、プロセスが実行中であること、値が有効であること、および出力を考慮する必要があることを示します。TagID 10003 ビットは、多くの異なるプロセスに関連するグローバルな指標であり、この 1 つの値に固有のものではありません。

私が探している結果は、TagID 3004 の最大値を毎日 (表 Turbs から) 表示する必要がありますが、TagID 10003 が「1」(オンライン) になるまでの間の値のみを使用して、「0」になります (オフライン)。これは簡単に数日または数週間に及ぶ可能性があります。

誰でもこれで私を助けることができますか?

返信の更新: 返信ありがとうございます - あなたは正しい考えを持っていますが、それは私が自分の試みで見てきたことである毎日真夜中の値しか返しません. 私は、このデータベース設計が本当の問題であり、このままにしておくと気が狂ってしまうだろうと考え始めています。TagID 3004 は、1 日を通して 5 分ごとにログに記録されます。TagID 10003 は、値が変更されたとき (および毎日午前 0 時) にのみログに記録されます。したがって、何時間も何日も値が変わらない場合、2番目のクエリから値が得られません。また、一致したとしても、両方のタイムスタンプが一致することはめったにないため、結果が見つかる可能性は低いです。

実例として、OnLine ビットに対するこのクエリを使用すると、OnLine のエントリが 1 日あたりどれだけ少ないかを確認できます。

DECLARE @OnLine TABLE (RN int IDENTITY(1,1), TIMEandDATE datetime, VALUE float)
Declare @StartDT DateTime
Declare @EndDT DateTime
Set @StartDT = '11/1/2012'
Set @EndDT = '12/1/2012'

INSERT INTO @OnLine
               SELECT TOP 1 @StartDT, 
        VALUE FROM StatusBits 
        WHERE TagID = 10003 
        AND TIMEandDATE < @StartDT 
        ORDER BY TIMEandDATE DESC
INSERT INTO @OnLine
               SELECT TIMEandDATE, 
        VALUE FROM StatusBits 
        WHERE TagID = 10003
                AND TIMEandDATE >= @StartDT 
        AND TIMEandDATE < @EndDT
               ORDER BY TIMEandDATE
INSERT INTO @OnLine
               SELECT TOP 1 @ENDDT, 
        VALUE FROM StatusBits 
        WHERE TagID = 10003 
        AND TIMEandDATE < @EndDT 
        ORDER BY TIMEandDATE DESC

以下を返します。

record  Timestamp       Value
1   2012-11-01 00:00:00.000 0
2   2012-11-01 23:59:59.087 0
3   2012-11-02 23:11:44.450 1
4   2012-11-03 00:00:00.807 1
5   2012-11-03 13:47:26.113 0
6   2012-11-03 13:52:42.083 1
7   2012-11-03 14:24:54.287 0
8   2012-11-03 23:59:59.387 0
9   2012-11-04 23:34:16.257 1
10  2012-11-04 23:59:59.840 1
11  2012-11-05 15:31:07.133 1
12  2012-11-05 23:59:59.230 1
13  2012-11-06 07:47:37.477 0
14  2012-11-06 15:44:48.247 0
15  2012-11-06 23:59:59.013 0
16  2012-11-07 07:11:33.280 1
17  2012-11-08 00:00:00.537 1 

TagID 10003 が 0 から 1 に変わるまでの間に、tagID 3004 の結果を返そうとしています。それがどのように照会できるのかさえわかりません。多分何とかBETWEENを使用していますか?

4

1 に答える 1

0

これを使用して、2 番目のテーブルの値を選択できます。

Declare @StDate DateTime = '11/1/2012'
Declare @EndDate DateTime = '12/1/2012'

;WITH
OnlineDates AS
(
    SELECT TIMEandDATE as MyDate
    FROM StatusBits
    Where TagID = 10003
        and Value = 1
        and TimeAndDate >= @StDate
        and TimeAndDate < @EndDate
)
Select dateadd(day,(datediff(day,0,TIMEandDATE)),0) as MyDate, MAX(Value) AS Max_Turb 
From Turbs T 
    INNER JOIN
        OnlineDates OD
    ON 
        t.TIMEandDATE BETWEEN 
        (
            SELECT TOP (1) X.TIMEandDATE
            FROM StatusBits X
            WHERE X.TagID = 10003
                AND X.Value = 0
                AND X.TIMEandDATE <= t.TIMEandDATE
            ORDER BY DESC

        )
        AND OD.MyDate
where TagID = 3004
Group by dateadd(day,(datediff(day,0,TIMEandDATE)),0)
Order by dateadd(day,(datediff(day,0,TIMEandDATE)),0)

ただし、2 番目のテーブルから最大日付と最小日付を選択し、それによってフィルター処理することが必要かどうかはわかりません。

お役に立てれば!

編集: 探しているものを取得するために、X と Y の間の TIMEandDATE が必要です。すでに Y がありました。その場合、X は値 0 の最も近い日付になります。上記の編集されたクエリを試して、お知らせください。

于 2013-02-05T21:31:20.557 に答える