Выбор min(значение) и max(значение) из столбца и возврат его в одной строке с помощью Listagg в Oracle

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