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

Откуда: Пермь
Сообщений: 57
Здравствуйте, остро возник вопрос как в одной таблице сравнить некоторые строки, а то есть есть таблица:
c_sign c_type_signlocationorientationbegkmexistance
235055551020.7234
267754690020.7272
267373091020.7432
235093091020.7684
235105441020.7824
267395441020.7962
235125440020.944
267505440020.9562
235145511021.0034
235155511021.0034
267513951021.0292
..................

необходимо вернуть те строки с параметром existance=2 при условии что есть такая же строка с параметром existance=4, параметры c_type_sign,location,orientation равны, а параметр begkm равен или отличается в пределах 0,05, и что самое главное при возврате должна указываться разница begkm.
Для понятности: 6 строка по параметрам c_type_sign,location,orientation совпадает со строкой 5 и параметр begkm находится в диапазоне менее 0,05,
В данном случае должно вернутся:
c_sign c_type_signlocationorientationbegkmexistanceraznica
267395441020.7962-14

Заранее благодарен всем!!!
28 мар 12, 07:41    [12324590]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
янзи
Guest
ArtyLyght,

а почему не возвращаются строки 3 и 8? для них ведь тоже есть соответствующие записи с existance = 4.
и что делать, если допустим, есть несколько записей с existance = 4 и одинаковыми c_type_sign, location, orientation, то какой из них брать?
28 мар 12, 08:12    [12324651]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
ArtyLyght
Member

Откуда: Пермь
Сообщений: 57
янзи, Да действительно забыл уточнить это.
В таком случае необходимо брать ту строку с которой разница begkm будет наименьшей.
28 мар 12, 08:19    [12324678]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
янзи
Guest
ArtyLyght,
а строки 3 и 8 должны быть в результате? если да, то как то так

with cte as (
select * from (values 
		(23505,555,1,0,20.723,4)
		, (26775, 469, 0, 0, 20.727, 2)
		, (26737, 309, 1, 0, 20.743, 2)
		, (23509, 309, 1, 0, 20.768, 4)
		, (23510, 544, 1, 0, 20.782, 4)
		, (26739, 544, 1, 0, 20.796, 2)
		, (23512, 544, 0, 0, 20.94, 4)
		, (26750, 544, 0, 0, 20.956, 2)
		, (23514, 551, 1, 0, 21.003, 4)
		, (23515, 551, 1, 0, 21.003, 4)
		, (26751, 395, 1, 0, 21.029, 2)
	) t(c_sign, c_type_sign, location, orientation, begkm, existance)
)

select
	top 1 with ties a.c_sign, a.c_type_sign, a.location, a.orientation, a.begkm, a.existance, b.begkm, cast((b.begkm - a.begkm) * 1000 as int) raznica
from
	cte a
	join cte b 
on
	a.c_type_sign = b.c_type_sign
	and a.location = b.location
	and a.orientation = b.orientation
	and abs(a.begkm - b.begkm) < .05
where
	a.existance = 2
	and b.existance = 4
order by row_number() over (partition by a.c_sign order by abs(a.begkm - b.begkm))
28 мар 12, 08:32    [12324726]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
ArtyLyght
Member

Откуда: Пермь
Сообщений: 57
янзи,
Спасибо огромное, все заработало!
Если не сложно не могли бы расписать с пояснениями, чисто для меня чтобы я понял. Заранее спасибо
28 мар 12, 09:20    [12324880]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить