另一行假設我有三列的表:查找在同一個表基於當前行中的Oracle
- 事件ID(PK)
- 標籤名
- TagValue
我需要創建一個查詢,結果是這樣的:
- 事件ID
- 標籤名
- TagValue
- PreviousConditionTag
- PreviousConditionValue
凡PreviousConditionTag /值從標籤名和前行的TagValue(當事件ID排序)。
在這個問題的一個簡化版本,PreviousConditionTag總是相同的標籤名 - 也就是,我只需要檢索當前標記名的前值。我使用Oracle的LAG分析函數解決了這個問題,通過TagName進行分區。
但是,現在我需要執行類似的操作,但對於其中的PreviousConditionTag是與TagName相關的任意標記的情況,其他TagName與PreviousConditionTag之間的關係不是一對一的表。
例如,如果給定的行具有「ABC」的標籤名,關係表可能會說,我需要查找或者「IJK」以前的值或「XYZ」。
我能想出這個邏輯在Oracle的功能,做一個SELECT對同一個表,並查找MAX(事件ID)的標準相匹配。例如:
SELECT * FROM MyTable WHERE EventID = (
SELECT MAX(EventID) FROM MyTable WHERE TagName IN (
SELECT ConditionTagName FROM ConditionMappingTable WHERE TagName = [CurrentTagName]
)
) AND EventID <= [CurrentEventId]
但是,你可以想像,因爲這種查詢是在MyTable的的每一行的函數執行,我關心它的性能。
我試圖想辦法再次使用Oracle的LAG的分析,但我不知道如何來爲它的PARTITION子句,因爲分區出現重疊。 (例如標籤ABC需要查看IJK和XYZ和標籤DEF需要查看IJK和UVW)
任何想法?
在這種情況下抵消的目的是什麼? Oracle LAG()分析具有我可以指定的偏移量,並且在我只需要給定標記的前一個值的簡單情況下,偏移量爲1.在此情況下,偏移量在技術上仍然爲「1」,但分區並不那麼直截了當。在原始數據中,我所查找的以前的標記可能先前發生過任意數量的行(根據事件id排序時,它並不總是在當前行之前發生)。 – acee
我的歉意。我更好地回答這個問題,並重新回答。我可能已經獲得了ConditionTagName和CurrentTagName向後。 –
沒問題,謝謝你再來看看!你的建議是按照條件而不是現在的價格來查找,這似乎有很大的不同。我重寫了我的查詢來做到這一點,現在不到一秒鐘就完成了,而不是之前的5到6秒。謝謝你的幫助! – acee