Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Функция GREATEST отдельно от списка с параметрами / 20 сообщений из 20, страница 1 из 1
25.02.2020, 14:36
    #39930623
Necrosss
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция GREATEST отдельно от списка с параметрами
Здравствуйте.

Допустим есть поле в таблице '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
25.02.2020, 14:40
    #39930626
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция GREATEST отдельно от списка с параметрами
Necrosss,

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

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

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

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


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

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

Для начала изменил тип поля, в котором прописан список чисел на 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
02.03.2020, 13:15
    #39932959
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция GREATEST отдельно от списка с параметрами
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
03.03.2020, 16:25
    #39933633
Necrosss
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция GREATEST отдельно от списка с параметрами
Чтобы не создавать новую тему спрошу здесь (тем более вопрос так или иначе относится к работе выше)

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

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

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


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