#mysql #sql
#mysql #sql
Вопрос:
Я пытаюсь решить проблему с SQL.
У меня есть база данных SQL, в которой есть таблица с именем «данные», в этой таблице у вас есть строка с именем «точки». В этой строке примерно 10000 значений с плавающей запятой.
Я хочу создать настольное приложение, которое может сравнивать 10 последовательных значений (которые я ввожу вручную) с его ближайшими 10 последовательными значениями в базе данных.
exemple :
я хочу сравнить этот список из 10 значений (которые я ввожу):
10.1 , 25.4, 2, 35, 45, 78.9, 41.1, 44, 1, 65
с лучшим списком из 10 значений в моей базе данных, где 10 значений являются ближайшими к моим 10 введенным значениям (ВАЖНО : ЗНАЧЕНИЯ ДОЛЖНЫ БЫТЬ ПОСЛЕДОВАТЕЛЬНЫМИ ).
Вы можете увидеть ниже, что я хочу сделать, я хочу получить список из 10 последовательных значений, которые являются ближайшими к 10 значениям, которые я хочу сравнить.
точки (10000 значений …)
строка точек : 10, 15.5, 14.3, 2, 1, 10.2, 55, 65.3, 41, 10, 25.2, 3, 34, 44, 78.8, 41.2, 41, 2, 66, 44, 25.1, 33.2, 45, 75, 98, 12, 11.2 и т.д. и т.п.
10 значений, выделенных жирным шрифтом, являются наилучшими ближайшими последовательными значениями:
10 is near to 10.1
25.2 is near to 25.4
3 is near to 2
34 is near to 35
44 is near to 45
78.8 is near to 78.9
41.2 is near to 41.1
41 is near to 44
2 is near to 1
66 is near to 65
Есть ли какой-нибудь способ сделать это с помощью команды SQL?
Заранее спасибо.
Комментарии:
1. Все ли значения в одной строке? т.е.: строка 1 «10,15.5,14.3 …» или «строка 1 = 10, строка 2 = 15,5, строка 3 = 14,3. Если это первое, вам нужно сначала преобразовать его в строки, разделив значения, если последнее, вы можете использовать ответ GMB здесь.
2. Это вторая, когда каждая строка имеет значение, но я не мог использовать решение GMB для себя, я не настолько знаком с SQL
3. @hyspo … Таблицы SQL представляют собой неупорядоченные наборы. Не существует такого понятия, как «последовательные значения», если только столбец в таблице не указывает порядок.
Ответ №1:
Один из вариантов использует коррелированный подзапрос с ограничением строк:
select v.val,
(select val from mytable t order by abs(t.val - v.val) limit 1) as match_val
from (
select 10.1 as val
union all select 25.4
union all ...
) v
По сути, подзапрос выполняется для каждой строки в from
предложении (куда вы помещаете список значений): он сканирует таблицу, упорядочивает строки по разнице с исходным значением и выводит значение только верхней строки.
Комментарии:
1. Извините, я новичок в SQL, спасибо за ваш ответ, но как мне преобразовать ваш код для меня?
2. выберите data.points, (выберите точки из данных, где порядок по abs (data.points — data.points) ограничивает 1) как match_val из (выберите 10.1 в качестве точек объединение всех выберите 25.4 объединение всех выберите 2 объединение всех выберите 4 объединение всех выберите 1 объединение все выберите 3.5 ) v правильно ли это?
3. @GMB . , , я не думаю, что это то, о чем задается вопрос.
Ответ №2:
Таблицы SQL представляют собой неупорядоченные наборы. Вам нужен столбец для указания порядка.
Вы можете использовать lag()
или lead()
для объединения 10 значений. Тогда вам нужно определение ближайшего. Одна из возможностей — взять абсолютное значение различий и сложить их:
select t.*
from (select t.*,
lead(val, 1) over (order by <ordercol>) as val_2,
lead(val, 2) over (order by <ordercol>) as val_3,
. . .
lead(val, 9) over (order by <ordercol>) as val_10
from t
) t
order by abs(val - $val_1) abs(val_2 - $val_2) . . .
limit 1;
$val_1
, $val_2
, и так далее представляют значения, которые вы передаете.
Остальное просто сортировка и ограничение.