max - 从列中选择 min(value) 和 max(value) 并在单行中返回它在 Oracle 中使用 Listagg
问题描述
我有一张如下表
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;
解决方案
首先,不要将数字存储为带单位的字符串;将它们存储为数字。
假设数值然后您不需要使用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;
推荐阅读
- c# - 用 override 和 new 关键字覆盖 ToString()
- html - 如何在 html 模板中呈现节点 js 数据?
- python - 尽管缩进正确,但 Python 缩进错误
- swift - 在 ARKit 1.5 中重置会话时删除文本节点
- android - Android 上的硬件加速 H.264/HEVC 视频解码到 OpenGL FBO 或纹理
- python - 未找到带有参数 '('',)' 的 'update_comment' 的反向操作。尝试了 1 种模式:['comment\\/(?P
[0-9]+)$'] - shell - [Unix][Shell 脚本] 将一个文件夹中的所有文件复制到另一个文件夹
- angular - 角度(点击)没有在循环中调用函数
- jhipster - JHipster 和 Java 10
- scala - 无法覆盖特征的抽象方法