參見下面的例子,我已經使用WITH語句來「模擬」你的表。實際上,只需將「tbL」替換爲您的表名並刪除WITH子句即可。
查詢查找值更改的最大版本,並使用id和版本從表中返回該行。它還涉及沒有任何更新只有一個記錄版本的情況。
WITH tbl As
(
SELECT 1 As id, 3 As ver, 'Value2' As val FROM dual UNION ALL
SELECT 1 As id, 2 As ver, 'Value2' As val FROM dual UNION ALL
SELECT 1 As id, 1 As ver, 'Value1' As val FROM dual UNION ALL
SELECT 2 As id, 3 As ver, 'Value3' As val FROM dual UNION ALL
SELECT 2 As id, 2 As ver, 'Value2' As val FROM dual UNION ALL
SELECT 2 As id, 1 As ver, 'Value1' As val FROM dual
)
SELECT t.*
FROM tbl t
WHERE (t.id, t.ver) IN
(
SELECT z.id
, MAX(z.ver) As max_ver
FROM (SELECT x.id
, x.ver
, x.val
, LAG(x.val) OVER (PARTITION BY x.id ORDER BY ver) As lag_val
, MIN(x.ver) OVER (PARTITION BY x.id) As min_ver
, MAX(x.ver) OVER (PARTITION BY x.id) As max_ver
FROM tbl x
) z
WHERE ((z.min_ver = z.max_ver) -- where there is only one version
OR (z.val != z.lag_val) -- where the value has changed
)
GROUP BY z.id
);