2012-05-29 34 views
1

另一行假設我有三列的表:查找在同一個表基於當前行中的Oracle

  1. 事件ID(PK)
  2. 標籤名
  3. TagValue

我需要創建一個查詢,結果是這樣的:

  1. 事件ID
  2. 標籤名
  3. TagValue
  4. PreviousConditionTag
  5. 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)

任何想法?

回答

1

這是一個改寫的答案,現在我對它有了更好的理解。

你想查找重疊的集合的標籤,仍然可以得到以前事件ID。這個想法是這樣的:

  1. 添加到映射表中標識的所有當前標籤(所以當前標記=條件標籤)
  2. 加入的基礎上,條件標籤映射表,以獲取當前匹配的標籤。因此,這些行正在使用它們匹配的「當前」標籤進行重新標記,並且您可以將其用於滯後。
  3. 根據滯後邏輯獲取最新的EventId,由當前的標籤分區。
  4. 選擇Current和Condition標籤相同的結果。

    select t.* 
    from (select t.*, mt.CurrentTagName, mt.ConditionTagName, 
         lag(EventId, 1, NULL) 
         over (partition by mt.CurrentTagName 
           order by EventId) 
        from t join 
         (select CurrentTagName, ConditionTagName 
         from ((select CurrentTagName, ConditionTagName 
           from ConditionMappingTable mt 
          ) union all 
           (select distinct CurrentTagName, CurrentTagName 
           from ConditionMappingTable mt 
          ) 
          ) mt 
         ) 
         on mt.ConditionTagName = t.tagname 
    ) t 
    on CurrentTagName = ConditionTagName 
    

這似乎counterintuive,因爲你正在尋找的東西了倒退,由條件,而不是當前。而且,你正在乘以正在處理的行數。但是,它可能仍然比您使用的加入解決方案更快。

+0

在這種情況下抵消的目的是什麼? Oracle LAG()分析具有我可以指定的偏移量,並且在我只需要給定標記的前一個值的簡單情況下,偏移量爲1.在此情況下,偏移量在技術上仍然爲「1」,但分區並不那麼直截了當。在原始數據中,我所查找的以前的標記可能先前發生過任意數量的行(根據事件id排序時,它並不總是在當前行之前發生)。 – acee

+0

我的歉意。我更好地回答這個問題,並重新回答。我可能已經獲得了ConditionTagName和CurrentTagName向後。 –

+0

沒問題,謝謝你再來看看!你的建議是按照條件而不是現在的價格來查找,這似乎有很大的不同。我重寫了我的查詢來做到這一點,現在不到一秒鐘就完成了,而不是之前的5到6秒。謝謝你的幫助! – acee

相關問題