关于oracle数据库中获取版本号类数据最大值的sql
目前还在高度加班中,但是本次内容怕自己忘记,好不容易解决的,所以赶紧先随便抽点时间记录下,也没来得及考虑效率什么的优化问题,免得以后忘记了。
测试库结构如下:
表名为 testtab
字段名为testnum,server
测试数据如下:

获取最高版本号的数据sql如下:
WITH
L0 as (
SELECT MAX(to_number(regexp_replace(testnum,'([[:digit:]]+).([[:digit:]]+).([[:digit:]]+)','\1'))) fir FROM TESTTAB
),
L1 as (
SELECT MAX(to_number(regexp_replace(testnum,'([[:digit:]]+).([[:digit:]]+).([[:digit:]]+)','\2'))) sec FROM TESTTAB,L0
where testnum like fir||'.%'
),
L2 as (
SELECT MAX(to_number(regexp_replace(testnum,'([[:digit:]]+).([[:digit:]]+).([[:digit:]]+)','\3'))) thr FROM TESTTAB,L1,L0
where testnum like fir||'.'||sec||'.%'
)
select t3.* from L0,L1,L2,TESTTAB t3 where t3.testnum=fir||'.'||sec||'.'||thr;
最后得出查询结果:

sql主要用到的函数为with as,该函数主要用处是生成一个公共临时表,后面可复用,主要思路是分段比较,L0来获取第一段的最大值,L1在该基础上获取第二段的最大值,L2在之前基础上获取第三段的最大值,最后将其拼接获取最大值版本号作为查询条件去获取数据。
因为我们版本号是固定格式 A.B.C ,因此可以这样写,另外使用的数据库为oracle,mysql的暂时没空去考虑。
另外不能直接用oracle的MAX函数去比较,经粗略测试其比较方法类似于去除小数点并右补0进行比较大小,比如

如果确定第一段的数字是确定小于10的一位数,似乎是可以直接使用MAX的,只能说我没试出反例来,但是也没空去多试数据,所以不确定行不行
---------------------------------------------------------------------------------------------------------------2018-12-13 修订-------------------------------------------------------------------------------------------------------
还是和之前一样,还在加班中,昨天也就是上面写的,本身思路是没问题,分段比较肯定是最稳妥的一个办法,但是终究因为我sql水平有限,脱离了MAX函数,我不知道该如何将上面的那个sql在我需要的查询方法里用起来,今天想来想去,终究还是用了最原始的笨办法,为了能用上max函数,只好这样了,因为开发时间太紧迫,没时间给我仔细想别的办法了,项目毕竟要求12月底上线。
这次的思路是这样的:利用oracle的字符串处理,将版本号类型数据进行分段处理,每段进行左补0,每段长度补充到3位数一般足够用了,然后三段拼接,去除小数点,转为number类型,这样就可以利用上max函数了。
处理版本号的sql如下:
CREATE OR REPLACE
function dealAppMenuVersion (
v_in varchar2)
return number is v_out number(10,0);
begin
select to_number( lpad(SUBSTR(v_in, 1, INSTR(v_in,'.',1,1)-1),3,0)
||
lpad(SUBSTR(v_in, INSTR(v_in,'.',1,1)+1, INSTR(v_in,'.',1,2)-INSTR(v_in,'.',1,1)-1),3,0)
||
lpad(SUBSTR(v_in, INSTR(v_in,'.',1,2)+1, LENGTH(v_in)-INSTR(v_in,'.',1,2)),3,0)) into v_out from dual;
return v_out;
end;
测试结果如下:

在版本号可以转化为数字进行正常处理以后,接下来就方便了,先分组,然后根据版本号排序,将每个分组中的最高版本号的那行数据取出来即可。
测试代码如下:

这里得说说 ROW_NUMBER () OVER (PARTITION BY [field1] order by [field2] asc/desc) 这个oracle提供的函数,很好用,很久以前用过但是我给忘记了,这里自己记录下防止又忘记了,因为公司mysql用的比较多,oracle用的少函数很容易忘记。
这个函数大致意思上是根据field1进行分组,在该分组上按field2进行排序,还是我刚才的测试数据,效果图展示如下:

关于oracle数据库中获取版本号类数据最大值的sql的更多相关文章
- 如何在Oracle数据库中查看哪些用户在执行哪些SQL
对于DBA来说,这是一个非常常见的问题,DBA需要找出以下问题: 1.哪些用户在跑哪些SQL? 2.一个特定的SQL是被哪个用户在执行? 3.一个特定的用户在跑哪些SQL? 从这些问题中可以很明显的看 ...
- Oracle数据库中字段定义为Char类型,Hibernate用该字段进行动态绑定参数查询,获取不到结果的问题
一.问题背景 产生环境:oracle数据库,hibernate操作 定义了一个表 create table STORE_INFORMATION ( id CHAR(32) not null, name ...
- Oracle数据库中插入日期型数据(to_date的用法)(转载)
往Oracle数据库中插入日期型数据(to_date的用法) INSERT INTO FLOOR VALUES ( to_date ( '2007-12-20 18:31:34' , 'YYY ...
- Oracle数据库实现获取前几条数据的方法
如何在Oracle数据库中实现获取前几条数据的方法呢?就是类似SQL语句中的SELECT TOP N的方法.本文将告诉您答案,举例说明了哟! 1.在Oracle中实现SELECT TOP N : ...
- ORACLE数据库中执行计划出现INTERNAL_FUNCTION一定是隐式转换吗?
ORACLE数据库中,我们会使用一些SQL语句找出存在隐式转换的问题SQL,其中网上流传的一个SQL语句如下,查询V$SQL_PLAN的字段FILTER_PREDICATES中是否存在INTERNAL ...
- 将Oracle数据库中的数据写入Excel
将Oracle数据库中的数据写入Excel 1.准备工作 Oracle数据库"TBYZB_FIELD_PRESSURE"表中数据如图: Excel模板(201512.xls): 2 ...
- --关于null在oracle数据库中是否参与计算,进行验证,
--关于null在oracle数据库中是否参与计算,进行验证,with td as (select null id,1 name from dual ),td1 as ( select null id ...
- Oracle数据库中SYS、SYSTEM、DBSNMP、SYSMAN四用户的区别
[转] SYS.SYSTEM.DBSNMP. Oracle 数据库中 SYS.SYSTEM.DBSNMP.SYSMAN 四用户的区别 用户: SYS 用户: SYS,默认密码为 CHANGE_ON ...
- Oracle数据库中调用Java类开发存储过程、函数的方法
Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日 浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL, ...
随机推荐
- linux下如何查看某软件是否已安装
因为linux安装软件的方式比较多,所以没有一个通用的办法能查到某些软件是否安装了.总结起来就是这样几类: 1.rpm包安装的,可以用rpm -qa看到,如果要查找某软件包是否安装,用 rpm - ...
- 201901<<叶武滨时间管理100讲>>
2019年1月份读物整理: 1月份,在喜马拉雅上听的这个课程叶武滨时间管理100讲,每天利用上下班时间听完的,对其中的一些讲的点很有感触.今年的读书计划,希望自己能把读的每本书都用思维导图的方式整理出 ...
- iOS 小米推送总结和遇到的坑
极光推送就不赘述了,这里说下小米推送在ios上的坑吧,查了好久也没有查到相关的文章. 极光的强大就不说了,当客户贪图实惠的时候,当人家给你让你用小米推送的时候,我的内心是崩溃的,小米推送???没听过! ...
- jenkins构建任务后发送邮件
1.jenkins登录后-系统管理-系统设置打开后定位到下面的位置:系统管理员邮件地址一定要填写 2.下滑页面定位到extend E-mail Notification:这个是jenkins的一个插件 ...
- centos7安装配置jdk
① java -version 可以查看系统自带的openjdk版本信息 ② rpm -qa | grep java 查看系统自带的Java文件 ③ 卸载文件(noarch文件可以不用删除) -- ...
- debugging kubernetes (Delve and Goland)
1. Build from source cd GOPATH mkdir k8s.io cd k8s.io git clone https://github.com/kubernetes/kubern ...
- MySQL复制表-INSERT INTO SELECT
基础table为: mysql> select * from staff; +----+----------+-------+ | id | name | slary | +----+----- ...
- 2019MABU3月班——SAP导入总账科目小笔记
1. 在目录中找到“集中” 2.总账科目这里输入代码,公司代码为3000 3. 点“创建” 4. 然后可以填下面这些了 5. 转到“创建/银行/利息” 6. 选字段状态组 7. 保存 8.大功告成.
- 【js】js声明与数据类型
之前整理知识点感觉有点没有针对性,每期知识点之间都没有关联,不成体系,其实对学习与运用知识并无益,随着知识的积累,不使用就会忘记.所以从本次开始,将对知识点进行体系化.先列出本期知识体系图,再进行逐步 ...
- chocolatey使用
chocolatey使用 安装 使用管理员权限打开CMD,输入: @powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ( ...