2014-01-20 1 views
1

У меня есть две таблицы {пример данных - таблица А содержит несколько сотен строк, а таблица В имеет несколько тысяч строк}. Я хотел бы заполнить столбец B2 наименьшей абсолютной разницей между столбцом B1 и столбцом A2, который соответствует столбцу A1. ... OR ... set B2 = A1, где abs (B1-A2), ближайший к нулю.SQlite определить столбец на основе самой близкой разницы между двумя таблицами (vlookup)

Итак, в моей таблице ниже первая строка B1 - A2 = 1.6 - 1.4 = 0.2, которая является наименьшей разницей и соответствует 0 в A1 (и 1 и 2 для следующих двух строк, хотя это совпадение рождается моего отсутствия творчества, а не фактической структуры таблицы).

Таблица A

A1   A2 
0   1.4 
1   2.6 
2   4.3 

Таблица B

B1   B2 
1.6  [] 
2.7  [] 
4.4  [] 

или В2 = А1, где абс (В1-А2), ближе к нулю. Я не понимаю, как это определить с помощью SQLite. Я искал SO, но не нашел этот вопрос, сформулированный достаточно близко для моих скудных навыков SQLite, чтобы сделать прыжок. Самое близкое, что я видел, это SQLite - getting closest value, но это одна таблица, и только выбрать не обновление.

Я знаю, что большинство предпочитает, чтобы я предоставлял ответ в качестве отправной точки, но они либо полностью сбой, либо дают мне ошибку в попытке использовать функцию агрегата (мин), поэтому я не думаю, что это поможет с вопросом (но если вам интересно, я, к сожалению, потратил 2 часа на это). Поэтому я разрешаю это: есть ли способ для SQLite выполнить это? Любая помощь высоко ценится!

B2 = A1, где абс (B1-A2), ближайший к нулю. По сути, это вопрос стиля SQLite vlookup (Excel).

ответ

1

При фиксированном значении B1 называется X, этот запрос будет вычислять разницу для каждого A записи:

SELECT *, 
     abs(X - A2) 
FROM A 

Чтобы получить наименьшее значение, мы могли бы использовать MIN, но это будет только вычислить саму разницу. Чтобы получить другие значения из одной записи, то лучше использовать ORDER BY, как это, так что первая запись вернулась является один с наименьшим различием:

SELECT A1, 
     A2, 
     abs(X - A2) 
FROM A 
ORDER BY 3 

С LIMIT, только первая запись возвращается:

SELECT A1, 
     A2, 
     abs(X - A2) 
FROM A 
ORDER BY 3 
LIMIT 1 

Теперь мы хотим только значение A1, поэтому мы обернуть другой запрос вокруг этого:

SELECT A1 
FROM (SELECT A1, 
      abs(X - A2) 
     FROM A 
     ORDER BY 2 
     LIMIT 1) 

Теперь мы можем использовать тыс это весь запрос в качестве связанного подзапроса для UPDATE, где X является теперь B1 значение из текущей записи:

UPDATE B 
SET B2 = (SELECT A1 
      FROM (SELECT A1, 
         abs(B1 - A2) 
       FROM A 
       ORDER BY 2 
       LIMIT 1)) 
+0

, что огромное количество информации - спасибо. – deroses

 Смежные вопросы

  • Нет связанных вопросов^_^