Oracle排序過濾重複資料,取最新的資料

2021-06-18 09:47:55 字數 1480 閱讀 6025

問題:在專案中有一張裝置檢測資訊表device_info_tbl, 每個裝置每天都會產生一條檢測資訊,現在需要從該表中檢索出每個裝置的最新檢測資訊。也就是device_id欄位不能重複,消除device_id欄位重複的記錄,而且device_id對應的檢測資訊test_result是最新的。

解決思路:用oracle的row_number() over函式來解決該問題。

解決過程:

1.檢視表中的重覆記錄

select

t.id,

t.device_id,

t.update_dtm,

t.test_result

from device_info_tbl t

2.標記重複的記錄

select

t.id,

t.device_id,

t.update_dtm,

t.test_result,

row_number() over(partition by device_id order by t.update_dtm desc) as row_***   

from device_info_tbl t

3.過濾重複資料,取得最新的記錄

select

temp.id,

temp.device_id,

temp.update_dtm,

temp.test_result

from (

select

t.id,

t.device_id,

t.update_dtm,

t.test_result,

row_number() over(partition by device_id order by t.update_dtm desc) as row_***   

from device_info_tbl t ) temp

where temp.row_***  = '1'

row_number() over (partition by col1 order by col2) 表示根據col1分組,在分組內部根據 col2排序,而此函式計算的值就表示每組內部排序後的順序編號(組內連續的唯一的).

與rownum的區別在於:使用rownum進行排序的時候是先對結果集加入偽列rownum然後再進行排序,而此函式在包含排序從句後是先排序再計算行號碼.

row_number()和rownum差不多,功能更強一點(可以在各個分組內從1開時排序).

rank()是跳躍排序,有兩個第二名時接下來就是第四名(同樣是在各個分組內).

dense_rank()l是連續排序,有兩個第二名時仍然跟著第三名。相比之下row_number是沒有重複值的 .

lag(arg1,arg2,arg3):

arg1是從其他行返回的表示式

arg2是希望檢索的當前行分割槽的偏移量。是乙個正的偏移量,時乙個往回檢索以前的行的數目。

arg3是在arg2表示的數目超出了分組的範圍時返回的值。

通過ORACLE分析函式過濾重複資料

今天,確切的講應該是昨天下午,研發的同事突然向我尋求sql技術支援。看看他的問題,比較麻煩些。select sbl.fee terminal id sbl.status,smr.status,smr.report time from log sbl,report smr where sbl.task...

Oracle刪除重複資料

在oracle中,有個隱藏了自動rowid,裡面給每條記錄乙個唯一的rowid,我們如果想保留最新的一條記錄,我們就可以利用這個字段,保留重複資料中rowid最大的一條記錄就可以了。下面是查詢重複資料的乙個例子 select a.rowid,a.from 表名 a where a.rowid sel...

ORACLE刪除重複資料

我們可能會出現這種情況,某個表原來設計不周全,導致表裡面的資料資料重複,那麼,如何對重複的資料進行刪除呢?重複的資料可能有這樣兩種情況,第一種時表中只有某些字段一樣,第二種是兩行記錄完全一樣。一 對於部分字段重複資料的刪除 先來談談如何查詢重複的資料吧。下面語句可以查詢出那些資料是重複的 selec...