在 Oracle 中使用 Listagg 从列中选择 min(value) 和 max(value) 并将其返回到单行中

Selecting min(value) and max(value) from a column and returning it in a single row Using Listagg in Oracle

我有一个 table 如下所示

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

我想 select 值为:“1.0 m - 4.9 m”。

Select 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;

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


假设数值然后你不需要使用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;