Как я могу использовать несколько строк в предложении where?

#c# #sql #where-clause #firebird

Вопрос:

 TRAVEL    |  SIZE
0         |  0.41
2.5       |  0.45
5.0       |  0.50
7.5       |  0.54
10        |  0.58
 

Я использую базу данных Firebird.
Конечная цель состоит в том, чтобы получить путешествие в соответствии с заданным размером.
Проблема, с которой я сталкиваюсь, заключается в том, что заданный размер является непрерывным.

Например, заданный размер равен 0,47. И затем, путешествие получается из формулы интерполяции : (0.47-0.45)*(5.0-2.5)/(0.5-0.45) 2.5 = 3.5

На самом деле я попытался вычислить в C# после извлечения 2 строк примерно заданного размера. Но я застрял, чтобы извлечь 2 строки.

Как мне решить эту проблему.

Комментарии:

1. Я бы предложил использовать два запроса вместо того , чтобы пытаться сделать это в одном — один запрос будет select where size > value , а другой select where size < value , и каждый раз выбирать только первый результат (в LINQ это будет Take(1) ).

2. Не знаю о базе данных FireBird. В номальном sql я бы сделал select top(2) * from table order by abs(size-@givensize)

3. В чем именно заключается проблема, которую вы пытаетесь решить? Извлечение этих двух строк или что-то еще?

4. Можете ли вы ввести код, который вы пробовали?

5. @MatJ TOP(2) не является стандартным SQL. Для этого Firebird 3 и более поздние версии имеют стандарт SQL FETCH NEXT 2 ROWS , а более ранние версии имеют select first 2 ...

Ответ №1:

Я бы предложил lead() для этой цели:

 select (case when 0.47 = size then travel
             else travel   (next_travel - travel) * (0.47 - size) / (next_size - size)
        end) as imputed_size
from (select t.*,
             lead(size) over (order by size) as next_size,
             lead(travel) over (order by size) as next_travel
      from t
     ) t
where 0.47 >= size and
      (0.47 < next_size or next_size is null);
 

В более старых версиях Firebird вы можете использовать коррелированные подзапросы для получения следующих значений.

Комментарии:

1. Спасибо вам за ваш любезный ответ. Я выполняю ваше предложение и успешно получаю результат! Но формула интерфейса должна быть исправлена с другого размера (next_travel — путешествие) * (0,47 размера) / (next_size — размер) на другое путешествие (next_travel — путешествие) * (0,47 размера) / (next_size — размер) другие вещи являются префектом!!