對於一個項目,我需要跟蹤大量的變量。它需要被記錄,其中該變量等。表看起來(簡化爲一個可變型)這樣的用戶的變化(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個不同的變量......所以不應該是一個性能問題。
請參閱[sqlfiddle](http://sqlfiddle.com/#!2/66f23/1)。 – eggyal 2013-03-18 10:14:27
小提琴非常接近,但如果前一任務沒有任何修訂,則任務123的查詢不應該包含來自後一任務的任何變量。請參閱此修改的Fiddle,其中變量3應該只包含在第一個查詢中。 http://sqlfiddle.com/#!2/035a71/1沒關係,那沒什麼大不了的,但是看到我對錶演的編輯......哦,謝謝你的小提琴 - 也在努力,但你的速度更快:0) – dognose 2013-03-18 10:36:42