#max #aggregate #oracle12c #min #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 м — 4,9 м».
Выберите минимальную(значение) и максимальную(значение), разделенные строкой «-«.
Я попробовал нижеследующий список, но он выдает ошибку «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;
Комментарии:
1. Какую ошибку вы получаете? И, пожалуйста, отправьте свой полный запрос …
2. Если вы используете сравнение строк, то
100.0 m
меньше, чем2 m
as, для первых символов1
меньше, чем2
. Не храните числовые значения в виде строк.
Ответ №1:
Во-первых, НЕ храните числа в виде строки с единицами измерения; храните их в виде чисел.
Предполагая числовые значения, вам не нужно использовать 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;