#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 и более поздние версии имеют стандарт SQLFETCH 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 — размер) другие вещи являются префектом!!