2013-03-18 47 views
1

對於一個項目,我需要跟蹤大量的變量。它需要被記錄,其中該變量等。表看起來(簡化爲一個可變型)這樣的用戶的變化(ID是一個surogate鍵分辨版本的條目):最新的版本池變量

id | variable_id | change_time | change_user | change_task | revision | value 
1 1    some date  1    123   1   Hello World 
2 2    some date  1    123   1   22.5 
3 1    some date  2    456   2   Foo Bar 

檢索最新組修訂的(這裏的條目2和3),我使用在這裏描述的解決方案: Retrieving the last record in each group

將所得的查詢看起來像這樣:

SELECT 
    v1.id, 
    v1.value 
FROM 
    variable_history AS v1 
LEFT JOIN 
    variable_hisotry AS v2 
ON 
    (
    v1.variable_id = v2.variable_id AND 
    v1.revision < v2.revision 
) 
WHERE 
    v2.id IS NULL 

現在我需要修改該查詢,從而使以下規則適用:

  • 查詢最新的變量應該返回行2和3
  • 查詢最新的變量任務456應該返回行2和3
  • 查詢最新的變量任務123應該返回行1和2(用於歷史目的)

棘手的是,並非每個任務都在更改(更新)所有變量,所以我不能簡單地查詢所有變量的任務X.相反,如果有的話,我必須爲任務X提供變量,但是對於所有其他變量,來自任何任務< X但具有最高版本的變量。 (並排除後續任務的修訂)

對於任何情況,結果應包含所有變量。所以在這個小例子中,它總是應該有2行。

編輯:


查詢

SELECT 
     v1.id, 
     v1.value 
    FROM 
     (SELECT * FROM variable_history WHERE change_task <= 123) AS v1 
    LEFT JOIN 
     (SELECT * FROM variable_history WHERE change_task <= 123) AS v2 
    ON 
     (
     v1.variable_id = v2.variable_id AND 
     v1.revision < v2.revision 
    ) 
    WHERE 
     v2.id IS NULL 

按預期工作。然而具有約10.000 Entrys每天我不開心了雙重子選擇接着是加入...

http://sqlfiddle.com/#!2/cfda03/2

編輯:嗯,對對方:variable_history的每一行也綁定到entity_id和ofc。將2個子選擇限制爲一個有問題的實體將會減小表的大小。像150個不同的變量......所以不應該是一個性能問題。

回答

1
SELECT v.* 
FROM (
     SELECT variable_id, MAX(revision) revision 
     FROM  variable_history 
     GROUP BY variable_id 
     ) very_latest LEFT JOIN (
     SELECT variable_id, MAX(revision) revision 
     FROM  variable_history 
     WHERE change_task = ? 
     GROUP BY variable_id 
     ) task_latest USING (variable_id) 
    JOIN variable_history v 
    ON v.variable_id = very_latest.variable_id 
    AND v.revision = COALESCE(task_latest.revision, very_latest.revision) 
+0

請參閱[sqlfiddle](http://sqlfiddle.com/#!2/66f23/1)。 – eggyal 2013-03-18 10:14:27

+0

小提琴非常接近,但如果前一任務沒有任何修訂,則任務123的查詢不應該包含來自後一任務的任何變量。請參閱此修改的Fiddle,其中變量3應該只包含在第一個查詢中。 http://sqlfiddle.com/#!2/035a71/1沒關係,那沒什麼大不了的,但是看到我對錶演的編輯......哦,謝謝你的小提琴 - 也在努力,但你的速度更快:0) – dognose 2013-03-18 10:36:42