问题:项目中有设备发现信息表DEVICE_INFO_TBL。 每个设备每天生成发现信息。 当前,需要从该表中搜索每个设备的最新发现信息。 也就是说,device_id字段不能重复,device_id字段重复的记录将被删除,与device_id对应的检测信息test_result是最新的。
解决方法:使用Oracle的row_number () over函数解决此问题。
解决流程:
1 .查看表中的重复记录
选择
能干的烤鸡肉串
t.device_id,
t.update_dtm,
t.test_result
from DEVICE_INFO_TBL t
2 .标记重复的记录
选择
能干的烤鸡肉串
t.device_id,
t.update_dtm,
t.test_result,
row_number(over ) partitionbydevice _ idorderbyt.update _ DTM desc ) as row_flg
from DEVICE_INFO_TBL t
3 .过滤重复数据,获取最新记录
选择
temp.id,
temp.device_id,
temp.update_dtm,
temp.test_result
来自(
选择
能干的烤鸡肉串
t.device_id,
t.update_dtm,
t.test_result,
row_number(over ) partitionbydevice _ idorderbyt.update _ DTM desc ) as row_flg
来自设备_ info _ TBL t ) temp
where temp.row_flg='1'
row_number () over ) partitionbyCOL1orderbyCOL2)表示根据col1分组,在组中根据col2排序,并且由该函数计算的值在每个组中是源
与rownum的区别在于,如果使用rownum进行排序,则在结果集中添加伪列rownum,然后对其进行排序;相反,此函数在包含排序子句后进行排序,然后计算行号。
row_number ()与rownum几乎相同,功能更好一些) )可以在每个组中从1开始排序。
rank ) )是跳跃排名,第2位有2个的情况下排名第4 (同样在各组内)。
dense_rank ) ) l是连续排序,第二位有两个时保持第三位。 与此相对,row_number没有重复值。
lag(arg1、arg2、arg3) :
arg1是从其他行返回的表达式
arg2是要检索的当前低分区的偏移量。 是正偏移,是搜索上一行的次数。
arg3是arg2表示的数字超出分组范围时返回的值。