【问题标题】:Selecting min(value) and max(value) from a column and returning it in a single row Using Listagg in Oracle从列中选择 min(value) 和 max(value) 并在单行中返回它在 Oracle 中使用 Listagg
【发布时间】:2021-11-05 04:42:47
【问题描述】:

我有一张像下面这样的表格

gen_id pos_id Language Value
1221    1234    EN      1.0 m
1221    1234    EN      2.0 m
1221    1234    EN      3.0 m
1221    1234    EN      4.9 m

我想选择值:“1.0 m - 4.9 m”。

选择以字符串“-”分隔的min(value)和max(value)。

我尝试了下面的 listagg 但它抛出了错误 "ORA-00937: 不是单组群函数 00937. 00000 - “不是单组群函数””。

Select  LISTAGG (min(value) || '-' || max(value))   
             WITHIN GROUP (ORDER BY pos_id)
             OVER (PARTITION BY geng_id,pos_id,language)
From TSS_Gen where geng_id = 1221 and Pos_id = 1234;

【问题讨论】:

  • 你得到什么错误?请发布您的完整查询...
  • 如果您使用字符串比较,则100.0 m 小于2 m,因为第一个字符1 小于2。不要将数值存储为字符串。

标签: max aggregate oracle12c min listagg


【解决方案1】:

首先,NOT 将数字存储为带单位的字符串;将它们存储为数字。


假设数值,那么您不需要使用LISTAGG(或解析函数),可以简单地聚合和使用字符串连接:

SELECT min(value) || ' m - ' || max(value) || ' m'
FROM   TSS_Gen
WHERE  geng_id = 1221
AND    Pos_id = 1234;

如果您要存储单位,那么假设它们都是米,那么:

SELECT min(TO_NUMBER(SUBSTR(value, 1, LENGTH(value) - 2))) || ' m'
       || ' - '
       || max(TO_NUMBER(SUBSTR(value, 1, LENGTH(value) - 2))) || ' m'
FROM   TSS_Gen
WHERE  geng_id = 1221
AND    Pos_id = 1234;

【讨论】:

    猜你喜欢
    • 2012-06-26
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 2021-02-28
    相关资源
    最近更新 更多