提问人:TheoB 提问时间:4/11/2022 更新时间:4/11/2022 访问量:45
列的最大值
Maximum value of a column
问:
在我的 Oracle 数据库中,我在一列中包含以下值:
6.40.123580
10.10.114580
10.10.114582
我想在此列上执行 MAX() 函数,但如果我举个例子,我永远不会得到“10.10.114582”。它显示“6.40.123580”。
有解决办法吗? 谢谢!
答:
0赞
MT0
4/11/2022
#1
直接在字符串上使用不起作用,因为它将值作为字符串进行比较,并查找最大的第一个字符,然后是最大的第二个字符,等等。由于 (at start of ) 大于 (at start of ),因此当作为字符串进行比较时,它更大。MAX
6
6.40.123580
1
10.10.11458?
6.40.123580
您需要做的是拆分字符上的字符串,然后以数字方式比较各部分。.
为此,您可以使用简单(快速)字符串函数来查找分隔符的位置,然后找到这些分隔符之间的子字符串以获取数值分量,然后取每个连续分量中值最大的行:.
SELECT version_number,
TO_NUMBER(SUBSTR(version_number, 1, sep1 - 1)) AS major,
TO_NUMBER(SUBSTR(version_number, sep1 + 1, sep2 - sep1)) AS minor,
TO_NUMBER(SUBSTR(version_number, sep2 + 1)) AS patch
FROM (
SELECT version_number,
INSTR(version_number,'.',1,1) AS sep1,
INSTR(version_number,'.',1,2) AS sep2
FROM table_name
)
ORDER BY major DESC, minor DESC, patch DESC
FETCH FIRST ROW ONLY;
或者,使用(较慢的)正则表达式:
SELECT version_number,
TO_NUMBER(REGEXP_SUBSTR(version_number, '\d+', 1, 1)) AS major,
TO_NUMBER(REGEXP_SUBSTR(version_number, '\d+', 1, 2)) AS minor,
TO_NUMBER(REGEXP_SUBSTR(version_number, '\d+', 1, 3)) AS patch
FROM table_name
ORDER BY major DESC, minor DESC, patch DESC
FETCH FIRST ROW ONLY;
对于示例数据,其中:
CREATE TABLE table_name (version_number) AS
SELECT '6.40.123580' FROM DUAL UNION ALL
SELECT '10.10.114580' FROM DUAL UNION ALL
SELECT '10.10.114582' FROM DUAL;
两个输出:
VERSION_NUMBER 主要 次要 补丁 10.10.114582 10 10 114582
如果你特别想使用聚合函数,那么你可以只使用只保留最大的组成部分:MAX
MAX() KEEP ()
SELECT MAX(version_number) KEEP (
DENSE_RANK LAST ORDER BY
TO_NUMBER(SUBSTR(version_number, 1, sep1 - 1)),
TO_NUMBER(SUBSTR(version_number, sep1 + 1, sep2 - sep1)),
TO_NUMBER(SUBSTR(version_number, sep2 + 1))
) AS max_version_number
FROM (
SELECT version_number,
INSTR(version_number,'.',1,1) AS sep1,
INSTR(version_number,'.',1,2) AS sep2
FROM table_name
);
对于示例数据,输出:
MAX_VERSION_NUMBER 10.10.114582
db<>fiddle 在这里
评论