Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Найти число ближайшее к заданному  [new]
SQLPowerUser
Member

Откуда: ссылка в профиле
Сообщений: 336
Есть таблица чисел
i
1,5
2,08
2,1
2,2
2,5
1,9
3

И таблица контрольных точек
d
2
2,17
2,45

Надо получить (сортировка не важна)
id
1,52
1,92
2,082
2,12,17
2,22,17
2,52,45
32,45
Здесь для каждого [i] надо найти ближайшее [d].

В исходных таблицах значения будут часто меняться. Задачу решил через 2 подзапроса:
declare @t table (i float)
insert into @t(i) values (1.5), (2.08), (2.1), (2.2), (2.5), (1.9), (3)
--select * from @t

declare @k table (d float)
insert into @k(d) values (2), (2.17), (2.45)
--select * from @k

;with t as (
  select *, cast(abs(i-d) as float(24)) [diff]
  from @t
  cross join @k
), res as (
  select *,
  case when diff = min(diff) over(partition by i) then d end [c]
  from t
)
select i, d
from res
where c is not null

Можно попроще? SQL 2014
24 апр 18, 16:18    [21365177]     Ответить | Цитировать Сообщить модератору
 Re: Найти число ближайшее к заданному  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
SQLPowerUser,
SELECT *
FROM @t a
CROSS APPLY
(
	SELECT TOP 1 d
	FROM @k b
	ORDER BY ABS(a.i-b.d)		
) b
24 апр 18, 16:21    [21365192]     Ответить | Цитировать Сообщить модератору
 Re: Найти число ближайшее к заданному  [new]
aleks222
Member

Откуда:
Сообщений: 923
TaPaK
SQLPowerUser,
SELECT *
FROM @t a
CROSS APPLY
(
	SELECT TOP 1 d
	FROM @k b
	ORDER BY ABS(a.i-b.d)		
) b


Индексы отдыхают.

Правильнее
1. Найти одно число ближайшее сверху.
2. Найти одно число ближайшее снизу.
3. Из двух взять ближайшее.
4. Тогда у индексов есть шанс.
24 апр 18, 16:26    [21365221]     Ответить | Цитировать Сообщить модератору
 Re: Найти число ближайшее к заданному  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
aleks222
TaPaK
SQLPowerUser,
SELECT *
FROM @t a
CROSS APPLY
(
	SELECT TOP 1 d
	FROM @k b
	ORDER BY ABS(a.i-b.d)		
) b


Индексы отдыхают.

Правильнее
1. Найти одно число ближайшее сверху.
2. Найти одно число ближайшее снизу.
3. Из двух взять ближайшее.
4. Тогда у индексов есть шанс.

нисомненно
24 апр 18, 16:46    [21365323]     Ответить | Цитировать Сообщить модератору
 Re: Найти число ближайшее к заданному  [new]
SQLPowerUser
Member

Откуда: ссылка в профиле
Сообщений: 336
TaPaK,

спасибо!

Число записей в обеих таблицах наврядли превысит 50. Индексы не нужны
24 апр 18, 17:05    [21365407]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить