powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Функция GREATEST отдельно от списка с параметрами
20 сообщений из 20, страница 1 из 1
Функция GREATEST отдельно от списка с параметрами
    #39930623
Necrosss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Допустим есть поле в таблице 'column_1', в нём есть запись в виде списка чисел '10, 5, 3, 1'
Я хотел сделать так:
Код: sql
1.
SELECT GREATEST(column_1) AS gr FROM ...


Не сработало. Выдало ошибку "Incorrect parameter count in the call to native function 'GREATEST'".

Задача в том что нужно найти большее число при том что список этих чисел находится в базе и (!важно) он не фиксирован, т.е. чисел через запятую может быть больше или меньше.

Возможно как-то сделать ?
...
Рейтинг: 0 / 0
Функция GREATEST отдельно от списка с параметрами
    #39930626
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Necrosss,

Лёгкого варианта нет.
Костыльный вариант - парсить строку, дробить на фрагменты, преобразовывать в числа, искать максимум.
Правильный вариант - изменить схему хранения, чтобы в одном поле хранилось только одно значение, использовать MAX().
...
Рейтинг: 0 / 0
Функция GREATEST отдельно от списка с параметрами
    #39930659
Necrosss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

"Правильный вариант" реализовать нет возможности, т.к. подобный список чисел присутствует у каждой строки в таблице.
По поводу первого варианта: Какой функцией предлагаете дробить на фрагменты и преобразовывать в числа ?
...
Рейтинг: 0 / 0
Функция GREATEST отдельно от списка с параметрами
    #39930664
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Necrosss
Какой функцией предлагаете дробить на фрагменты и преобразовывать в числа ?
Код: sql
1.
SUBSTRING_INDEX(SUBSTRING_INDEX(value, ',', position), ',', -1)
...
Рейтинг: 0 / 0
Функция GREATEST отдельно от списка с параметрами
    #39930676
Necrosss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Тут ещё и цикл, получается нужен...
...
Рейтинг: 0 / 0
Функция GREATEST отдельно от списка с параметрами
    #39930682
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ясен пень. На 8+ - обычный CTE, на 5+ придётся генерить список чисел или брать из какой-либо служебной таблицы.

Впрочем, на восьмёрке можно распарсить через JSON_TABLE(), без циклов.
...
Рейтинг: 0 / 0
Функция GREATEST отдельно от списка с параметрами
    #39930742
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в разных вариациях этот вопрос поднимался на форуме не раз
последний
замена in (.....)
...
Рейтинг: 0 / 0
Функция GREATEST отдельно от списка с параметрами
    #39930772
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавил "современный" метод парсинга CSV-полей: FAQ: обработка строк и парсинг текстов средствами MySQL
...
Рейтинг: 0 / 0
Функция GREATEST отдельно от списка с параметрами
    #39930775
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Necrosss
"Правильный вариант" реализовать нет возможности, т.к. подобный список чисел присутствует у каждой строки в таблице.
Само по себе это не аргумент. Обычно такие вещи выносятся в отдельную таблицу.
...
Рейтинг: 0 / 0
Функция GREATEST отдельно от списка с параметрами
    #39930776
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
Добавил "современный" метод парсинга CSV-полей: FAQ: обработка строк и парсинг текстов средствами MySQL
Спасибо!
...
Рейтинг: 0 / 0
Функция GREATEST отдельно от списка с параметрами
    #39930908
Necrosss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,
Я опечатался. Не в каждой таблице, а в каждой строке.


К слову.
JSON_TABLE это замечательно, но меня больше интересовало как сравнить числа из списка, нежели как их вывести на экран.
Я понял что GREATEST никак не будет работать (можно подставить в скобки любые числа, но кол-во запятых должно быть прописано заранее)
Склоняюсь к идее какой-нибудь "сортировки пузырьком" прямо в запросе.
...
Рейтинг: 0 / 0
Функция GREATEST отдельно от списка с параметрами
    #39930925
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Necrosss
меня больше интересовало как сравнить числа из списка, нежели как их вывести на экран
Какая разница-то? твоя забота получить их, а что дальше - выводить или сравнивать,- дело десятое.
...
Рейтинг: 0 / 0
Функция GREATEST отдельно от списка с параметрами
    #39931055
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft
Akina
Добавил "современный" метод парсинга CSV-полей: FAQ: обработка строк и парсинг текстов средствами MySQL
Спасибо!

Ага, здорово. Еще бы в эту тему что-нибудь аналогичное https://www.sql.ru/forum/687908-2/faq-vyborka-pervoy-posledney-zapisi-v-gruppah
...
Рейтинг: 0 / 0
Функция GREATEST отдельно от списка с параметрами
    #39931065
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
paver
Еще бы в эту тему что-нибудь аналогичное
переписать справку по CTE и ROW_NUMBER()? не смешно...
...
Рейтинг: 0 / 0
Функция GREATEST отдельно от списка с параметрами
    #39931067
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
paver
Еще бы в эту тему что-нибудь аналогичное
переписать справку по CTE и ROW_NUMBER()? не смешно...
А CTE зачем? Вроде в 8 версии оконных функций достаточно для этой задачи.
...
Рейтинг: 0 / 0
Функция GREATEST отдельно от списка с параметрами
    #39931088
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для нумерации - достаточно. А вот для выбора только первых - увы, оконки применяются к финальному набору.
...
Рейтинг: 0 / 0
Функция GREATEST отдельно от списка с параметрами
    #39932877
Necrosss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я решил задачу по своему. Выложу сюда, может кому-нибудь пригодится.

Для начала изменил тип поля, в котором прописан список чисел на JSON. (и добавил квадратные скобки) Теперь это официально json-массив - '[10, 5, 3, 1]'.

Далее пришлось писать свою функцию:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
DELIMITER $$
CREATE DEFINER=`root`@`localhost` FUNCTION `JSON_BUBBLE_SORT`(`JsonArray` JSON) RETURNS json
    NO SQL
BEGIN

DECLARE ArrayCount INT DEFAULT JSON_LENGTH(JsonArray);
DECLARE i, x INT DEFAULT 0;
DECLARE CurrElTmpl, NextElTmpl VARCHAR(6);
DECLARE CurrElVal, NextElVal INT;

WHILE i < ArrayCount DO
   
  WHILE x < ArrayCount - 1 DO
  
  SET CurrElTmpl = CONCAT_WS(x, '$[', ']');
  SET NextElTmpl = CONCAT_WS(x + 1, '$[', ']');
  
  SET CurrElVal = JSON_EXTRACT(JsonArray, CurrElTmpl);
  SET NextElVal = JSON_EXTRACT(JsonArray, NextElTmpl);

  SET JsonArray = IF (CurrElVal > NextElVal,
        JSON_REPLACE(JsonArray, CurrElTmpl, NextElVal, NextElTmpl, CurrElVal),
        JsonArray);

  SET x = x + 1;
  END WHILE;

SET x = 0;
SET i = i + 1;
END WHILE;

  RETURN JsonArray;
END$$
DELIMITER ;



Функция принимает не отсортированный json-массив и выдаёт отсортированный.

Ну а дальше просто:
Код: sql
1.
2.
3.
4.
5.
6.
7.
SET @Params = (SELECT column_1 FROM `table_1` WHERE `id` = '1');
SET @Sorted = JSON_BUBBLE_SORT (@Params);

SET @Min = JSON_EXTRACT(@Sorted, '$[0]');
SET @Max = JSON_EXTRACT(@Sorted, '$[last]');

SELECT @Min, @Max;



Приветствуются замечания, критика и предложения по сокращению и оптимизации кода.
...
Рейтинг: 0 / 0
Функция GREATEST отдельно от списка с параметрами
    #39932959
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Necrosss
Приветствуются замечания, критика и предложения по сокращению и оптимизации кода.
Я вроде дал ссылку на парсинг через JSON... отсортировать да собрать обратно куда как проще, чем циклы крутить.

Код: sql
1.
2.
3.
4.
5.
6.
SELECT GROUP_CONCAT(jsontable.value ORDER BY 0 + jsontable.value) sorted
FROM test
CROSS JOIN JSON_TABLE( CONCAT('[', test.csv, ']'),
                       "$[*]" COLUMNS( value VARCHAR(254) PATH "$" )
                     ) AS jsontable
GROUP BY test.csv;


И уж тем более когда у тебя входные данные уже JSON - не надо даже превращать CSV-массив в JSON-массив.
...
Рейтинг: 0 / 0
Функция GREATEST отдельно от списка с параметрами
    #39933633
Necrosss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чтобы не создавать новую тему спрошу здесь (тем более вопрос так или иначе относится к работе выше)

JSON_TYPE для JSON_EXTRACT(@Array, '$[0]') показывает INTEGER.

Но функция GREATEST/LEAST видит в записи, возвращаемой JSON_EXTRACT строку а не число и поэтому выдаёт неправильный результат.
Помогло только CAST(JSON_EXTRACT(@Array, '$[0]') AS UNSIGNED)

Почему так ?
...
Рейтинг: 0 / 0
Функция GREATEST отдельно от списка с параметрами
    #39933852
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Necrosss
Почему так ?
Отсутствие строгой типизации.
JSON_TYPE показывает, что значение может быть без ошибки интерпретировано как число - однако на самом деле это строковый литерал. А вот GREATEST/LEAST работает в контексте реально переданного значения, и если оно передано как строковое, то и обработается как строка.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Функция GREATEST отдельно от списка с параметрами
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]