我想寫一個oracle sql查詢,按照TIMESTAMP順序保留前三條最新記錄,并洗掉每個MACHINE_ID的其余記錄。 我想知道我可以如何有效地做到這一點。希望你能理解我的問題!
下面是表格的例子。所有USERFILE=0的記錄都可以在sql查詢中被過濾掉。***結果后--按MACHINE_ID分組,并按TIMESTAMP降序排序 **
在留下每個MACHINE_ID的前3條最新記錄并洗掉最舊的記錄后,最終結果應該是
uj5u.com熱心網友回復:
你可以對每臺機器的行進行編號,然后洗掉所有編號大于3的行。理想情況下,我們可以簡單地從查詢中洗掉,但我在Oracle 19c中嘗試這樣做時得到ORA-01732:資料操作在此視圖上不合法。
因此我們需要兩個步驟:
- 找到這些行 洗掉這些行
使用rowid的陳述句可以再次快速訪問這些行:
delete from mytable
where rowid in
(
select rowid
from
(
select select
rowid,
row_number() over(partition by machine_id order by timestamp desc) as rn
from mytable
)
where rn > 3
);
uj5u.com熱心網友回復:
一種方法是:
delete from t
where t.timestamp not in (select t2.timestamp
from t t2.
where t2.machine_id = t.machine_id
order by t2.timestamp desc
fetch first 3 rows only
);
為了提高性能,你需要一個關于(machine_id, timestamp desc)的索引。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/308140.html
標籤:



