SQL: я хочу сравнить 10 последовательных значений

#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 , и так далее представляют значения, которые вы передаете.

Остальное просто сортировка и ограничение.