powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Найти число ближайшее к заданному
5 сообщений из 5, страница 1 из 1
Найти число ближайшее к заданному
    #39635510
SQLPowerUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица чисел
i1,52,082,12,22,51,93
И таблица контрольных точек
d22,172,45
Надо получить (сортировка не важна)
id1,521,922,0822,12,172,22,172,52,4532,45Здесь для каждого [i] надо найти ближайшее [d] .

В исходных таблицах значения будут часто меняться. Задачу решил через 2 подзапроса:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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
...
Рейтинг: 0 / 0
Найти число ближайшее к заданному
    #39635513
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQLPowerUser,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT *
FROM @t a
CROSS APPLY
(
	SELECT TOP 1 d
	FROM @k b
	ORDER BY ABS(a.i-b.d)		
) b
...
Рейтинг: 0 / 0
Найти число ближайшее к заданному
    #39635516
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKSQLPowerUser,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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. Тогда у индексов есть шанс.
...
Рейтинг: 0 / 0
Найти число ближайшее к заданному
    #39635523
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222TaPaKSQLPowerUser,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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. Тогда у индексов есть шанс.
нисомненно
...
Рейтинг: 0 / 0
Найти число ближайшее к заданному
    #39635536
SQLPowerUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,

спасибо!

Число записей в обеих таблицах наврядли превысит 50. Индексы не нужны
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Найти число ближайшее к заданному
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]