列的最大值

Maximum value of a column

提问人:TheoB 提问时间:4/11/2022 更新时间:4/11/2022 访问量:45

问:

在我的 Oracle 数据库中,我在一列中包含以下值:

6.40.123580

10.10.114580

10.10.114582

我想在此列上执行 MAX() 函数,但如果我举个例子,我永远不会得到“10.10.114582”。它显示“6.40.123580”。

有解决办法吗? 谢谢!

SQL 预言机

评论


答:

0赞 MT0 4/11/2022 #1

直接在字符串上使用不起作用,因为它将值作为字符串进行比较,并查找最大的第一个字符,然后是最大的第二个字符,等等。由于 (at start of ) 大于 (at start of ),因此当作为字符串进行比较时,它更大。MAX66.40.123580110.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

如果你特别想使用聚合函数,那么你可以只使用只保留最大的组成部分:MAXMAX() 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 在这里