#sql #sql-server #sql-server-2008
#sql #sql-сервер #sql-server-2008
Вопрос:
Предполагая, что существует таблица t со следующими столбцами: Code int, Имя nvarchar(50).
Я хотел бы запросить в таблице наиболее подходящую строку для данного кода c. Наиболее подходящие критерии (в порядке важности):
- 1) выберите строку, код которой соответствует c
- 2) выберите строку, код которой больше, чем c (но самый первый). Например, если c = 4 и t содержит 1, 2, 3, 5, 6, и 7, я бы хотел выбрать 5.
- 3) выберите строку, код которой меньше c. Например, если c = 4 и t содержит 3, 2 и 1, я бы хотел выбрать 3.
Код будет находиться в хранимой процедуре.
Может кто-нибудь, пожалуйста, подсказать, как выполнить вышеуказанное.
Спасибо.
Примерные данные и ожидаемые результаты:
1, "Name1"
2, "Name2"
4, "Name4"
5, "Name5"
If c=2, result: 2,"Name2"
If c=3, result: 4,"Name4"
if c=6, result: 5,"Name5"
Комментарии:
1. опубликуйте некоторые примеры данных и ожидаемый результат, вашу попытку.
2. Все еще не ясно в вашей таблице ввода и наборе результатов вывода. Не могли бы вы предоставить это?
Ответ №1:
Я бы упорядочил строки по двум критериям — абсолютному расстоянию от целевого числа и тому, больше оно или меньше, и просто выбрал верхнюю строку. Например, предполагая, что целевой код равен 4:
SELECT TOP 1 *
FROM t
ORDER BY ABS(code - 4) ASC, CASE WHEN code > 4 THEN 1 ELSE 0 END DESC
Ответ №2:
Это запрос топ-1; вам нужна одна наиболее подходящая запись. Так что выбирайте TOP 1
в нужном порядке ORDER BY
.
select top 1 *
from mytable
order by
case when code = @code then 1
when code > @code then 2
else 3
end,
abs(code - @code);