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を使用していますか?