[英]SQL Historian Query not returning all results
我正在使用歷史學家來搜索特定標簽的某些值。 歷史學家有一定的規則,例如,我不能創建或刪除表,查詢需要標記名等。
例如,我想搜索 TagName 'Tank1' 並返回其 DateTime 和 Value 結果,然后使用這些結果進一步搜索標簽以匹配在該 DateTime 具有相同值的那些標簽。
我在給定日期和時間之間搜索“Tank1”並收到 4 個結果,如下所示
2021-11-02 08:00:54.9870000 | 1 |
2021-11-02 10:22:27.9850000 | 1 |
2021-11-02 11:47:31.3360000 | 2 |
2021-11-02 23:11:57.8120000 | 2 |
因此,我需要搜索其他四個標簽並返回與 dateTime 和 value 匹配的結果。
下面的代碼是我制作的(我現在應該告訴你我是一個虛擬新手)
DECLARE @AT1Value INT,
@AT1DateTime DateTime
SELECT @AT1Value = Value, --GETS THE VALUES OF AT1 STERILISER
@AT1DateTime = DateTime --GETS THE DATETIME OF AT1 STERILISER VALUES
From Runtime.dbo.v_History
Where
Runtime.dbo.v_History.Tagname = 'AT1_Select_ster'
AND Runtime.dbo.v_History.DateTime >= '2021-11-02 08:00'
AND Runtime.dbo.v_History.DateTime <= '2021-11-03 08:01'
AND Runtime.dbo.v_History.Value > 0
Select a.DateTime,
a.TagName,
a.Value
From Runtime.dbo.v_History AS a --GETS THE VALUES OF THE FM TAGS AT THE DATETIME OF AT1 STERILISER VALUES
Where
((a.TagName = 'FM_S1_Batch' AND a.Value = @AT1Value AND a.DateTime = @AT1DateTime)
OR (a.Tagname = 'FM_S2_batch' AND a.Value = @AT1Value AND a.DateTime = @AT1DateTime)
OR (a.Tagname = 'FM_S3_batch' AND a.Value = @AT1Value AND a.DateTime = @AT1DateTime)
OR (a.Tagname = 'FM_S4_batch' AND a.Value = @AT1Value AND a.DateTime = @AT1DateTime))
AND a.Value > 0
這很好用,盡管它只產生下面的最后一個 dateTime 和 Value 結果,
2021-11-02 23:11:57.8120000 | FM_S2_batch 2 |
我是否正確地假設這是因為變量每次都被覆蓋並且只保存最后一個值?
應該返回的結果應該類似於下面的結果
2021-11-02 08:00:54.9870000 | FM_S1_batch 1 |
2021-11-02 10:22:27.9850000 | FM_S1_batch 1 |
2021-11-02 11:47:31.3360000 | FM_S2_batch 2 |
2021-11-02 23:11:57.8120000 | FM_S2_batch 2 |
無論如何我可以進行多次掃描並保存每個結果,直到獲得所需的所有結果? 還是有更簡單更合適的方法(我猜有)。
TIA
如果我理解正確,您希望您的int
和datetime
變量(@AT1DateTime 和@AT1Value)將包含第一個查詢返回的多個值。 那是行不通的(正如您所指出的,它們將只保留一個值)。
從提供的代碼來看,您根本不清楚是否需要將這些值存儲在變量中。 我想你可能正在尋找類似的東西:
Select a.DateTime,
a.TagName,
a.Value
From Runtime.dbo.v_History AS a
Where
a.TagName IN ('FM_S1_Batch', 'FM_S2_batch', 'FM_S3_batch', 'FM_S4_batch')
AND EXISTS
(SELECT *
From Runtime.dbo.v_History b
Where
b.Tagname = 'AT1_Select_ster'
AND b.DateTime >= '2021-11-02 08:00'
AND b.DateTime <= '2021-11-03 08:01'
AND b.Value > 0
AND b.Value = a.Value
AND b.DateTime = a.DateTime
)
AND a.Value > 0
這是您的兩個查詢合並為一個。 外部查詢的第二個/中間WHERE
條件檢查 a.value/a.datetime 組合是否存在於內部查詢中。
感謝所有花時間回復我的問題的人。 感謝@EdmCoff 建議嘗試使用for-loop 或cursor,我終於使用cursor 讓它工作了。
for 循環返回最后一個值 4 次,所以我嘗試了 cursor,它對我有用。
我在下面發布了適合我的代碼
DECLARE @AT1Value INT,
@AT1DateTime DateTime
DECLARE cursor_result CURSOR
FOR SELECT Runtime.dbo.v_History.Value,
Runtime.dbo.v_History.DateTime
From Runtime.dbo.v_History
Where
Runtime.dbo.v_History.Tagname = 'AT1_Select_ster'
AND Runtime.dbo.v_History.DateTime >= '2021-11-02 08:00'
AND Runtime.dbo.v_History.DateTime <= '2021-11-04 08:01'
AND Runtime.dbo.v_History.Value > 0
OPEN cursor_result
FETCH NEXT FROM cursor_result INTO
@AT1Value,
@AT1DateTime
WHILE @@FETCH_STATUS = 0
Select a.DateTime,
a.TagName,
a.Value
From Runtime.dbo.v_History AS a
Where
((a.TagName = 'FM_S1_Batch' AND a.Value = @AT1Value AND a.DateTime = @AT1DateTime)
OR (a.Tagname = 'FM_S2_batch' AND a.Value = @AT1Value AND a.DateTime = @AT1DateTime)
OR (a.Tagname = 'FM_S3_batch' AND a.Value = @AT1Value AND a.DateTime = @AT1DateTime)
OR (a.Tagname = 'FM_S4_batch' AND a.Value = @AT1Value AND a.DateTime = @AT1DateTime))
AND a.Value > 0
FETCH NEXT FROM cursor_result INTO
@AT1Value,
@AT1DateTime
END
CLOSE cursor_result
DEALLOCATE cursor_result
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.