带有字符串的Oracle SQL MAX()和MIN()

at0kjp5o  于 2022-11-22  发布在  Oracle
关注(0)|答案(2)|浏览(205)

我 在 从 数据 库 中 检索 MAX 数字 时 遇到 了 问题 。 问题 是 这些 数字 是 字符 串 格式 , 因为 它们 包含 下划线 。
示例 案例 :数据 库 里 有 三 个 号码 :
123456_1 、 123456_2 、 123456_13 、
我 想 获取 的 MAX 数字 是 123456_13 ( 基本 上 是 下划线 之后 的 最 大 值 ) , 但 由于 它们 是 字符 串 , Oracle 按 字母 顺序 处理 它们 , 并 按 升序 排序 :
1.小 行星 123456_1

  1. 123456_13 号 文件
    1.小 行星 123456_2
    使 123456_2 成为 MAX 。
    如果 我 不 需要 通过 替换 下划线 并 转换 为 数字 来 显示 实际 的 MAX 或 MIN 数字 , 这 是 可能 的 :
SELECT
  MAX(TO_NUMBER(REPLACE(number,'_',''))) max_nr,
  MIN(TO_NUMBER(REPLACE(number,'_',''))) min_nr
FROM
...

中 的 每 一 个
这 将 从 我 的 3 个 示例 中 返回 12345613 max _ nr 1234561 min _ nr , 但 我 需要 获取 带 下划线 的 实际 数字 并 显示 它 。
有 没有 办法 做到 这 一 点 ?

aiqt4smr

aiqt4smr1#

如果要同时获得最小值和最大值,可以使用keep语法两次,并按下划线后所有字符的等效数字进行排序:

select
  max(your_number)
    keep (dense_rank last
      order by to_number(substr(your_number, instr(your_number, '_') + 1))
    ) as max_number,
  min(your_number)
    keep (dense_rank first
      order by to_number(substr(your_number, instr(your_number, '_') + 1))
    ) as min_number
from your_table

| 最大数量|最小编号|
| - -|- -|
| 123456_13号文件|小行星123456_1|
fiddle
instr(your_number, '_')给出下划线的位置; substr(your_number, instr(your_number, '_') + 1)提供下划线后面的所有内容。
如果下划线前面的值不总是相同的位数,这将是一个工作,如果你只是删除它可能是一个问题。

hm2xizp9

hm2xizp92#

可以在ORDER BY语句中使用REPLACE,也可以在FETCH FIRST 1 ROW

select *
from T
order by TO_NUMBER(REPLACE(N,'_')) desc
fetch first 1 rows only;

SQLize - online editor

相关问题