** :
問題:在專案中有一張裝置檢測資訊表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去除重複, 取最新的第一條資料
解決思路 用oracle的row number over函式來解決該問題。解決過程 1.檢視表中的重覆記錄 2.標記重複的記錄 3.過濾重複資料,取得最新的記錄 row number over partition by col1 order by col2 表示根據col1分組,在分組內部根據 co...
Oracle排序過濾重複資料,取最新的資料
問題 在專案中有一張裝置檢測資訊表device info tbl,每個裝置每天都會產生一條檢測資訊,現在需要從該表中檢索出每個裝置的最新檢測資訊。也就是device id欄位不能重複,消除device id欄位重複的記錄,而且device id對應的檢測資訊test result是最新的。解決思路 ...
oracle去除重複行資料(保留重複行的一行)
在oracle實際應用過程中,可能會遇到沒有設定主鍵的表,會出現表的資料重複的情況,比如誤操作重複執行插值語句且直接commit,這時候就需要刪除重複資料,只保留單一資料,話不多說,走起。建表語句 建個簡單的表練手就好 create table del name varchar2 30 val nu...