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

Откуда: Одесса
Сообщений: 1102
Дано:

table1 filed1Name, field2PercentSkala имеет:

Иванов 1
Иванов 2,5
Иванов 4
Иванов 5

table2 filed1Name, field2Percent имеет:

Иванов 3

По данным из таблицы 2 нужно найти первое превышенное либо равное значение из таблицы 1 (джоинить по полю filed1Name)

В этом случае результат запроса должен быть
Иванов 2,5 (т.к. 3 больше чем 2,5 но меньше чем 4)


где-то как
select

(select f1 from t2 where t1.filed1Name = t2.filed1Name and ????)

from t1

Спасибо

Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (X64) Apr 22 2011 19:23:43 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7600: ) (Hypervisor)
18 май 12, 14:07    [12577013]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос без цикла  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
SELECT
  T2.filed1Name,
  (SELECT TOP 1 T1.field2PercentSkala FROM table1 T1 WHERE T2.filed1Name = T1.filed1Name AND T1.field2PercentSkala <= T2.field2Percent ORDER BY T1.field2PercentSkala) AS Value
FROM
  table2 T2 


Сообщение было отредактировано: 18 май 12, 14:17
18 май 12, 14:17    [12577116]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос без цикла  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
declare @t1 table(field1Name varchar(50),field2PercentSkala float)
insert into @t1(field1Name,field2PercentSkala)
values('Иванов', 1)
,('Иванов',2.5)
,('Иванов', 4)
,('Иванов', 5)

declare @t2 table(filed1Name varchar(50), field2Percent float) 
insert into @t2(filed1Name,field2Percent)
values('Иванов', 3)

select
	t1.field1Name
	,max(t1.field2PercentSkala)
from	@t1 t1
		inner join @t2 t2
		on	t2.filed1Name = t1.field1Name
			and t2.field2Percent>=t1.field2PercentSkala		
group by t1.field1Name	
18 май 12, 14:32    [12577272]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос без цикла  [new]
мимо
Guest
declare @t1 table(field1Name varchar(50),field2PercentSkala float)
insert into @t1(field1Name,field2PercentSkala)
values('Иванов', 1)
,('Иванов',2.5)
,('Иванов', 4)
,('Иванов', 5)

declare @t2 table(filed1Name varchar(50), field2Percent float) 
insert into @t2(filed1Name,field2Percent)
values('Иванов', 3)

select *
from (
	select a.*
			,row_number() over (partition by a.field1Name order by a.field2PercentSkala desc) as rt
	from @t1 as  a
		inner join @t2 as b on (b.filed1Name = a.field1Name)
	where b.field2Percent -a.field2PercentSkala >= 0	 
	) as y
where y.rt = 1	
18 май 12, 14:38    [12577322]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос без цикла  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
;with ranged(field1Name,field2PercentSkala,rn)
as(  
	select
		t1.field1Name
		,t1.field2PercentSkala
		,rn=ROW_NUMBER() over (partition by t1.field1Name order by t1.field2PercentSkala desc )
	from	@t1 t1
			inner join @t2 t2
			on	t2.filed1Name = t1.field1Name
				and t2.field2Percent>=t1.field2PercentSkala)
select 
	r.field1Name
	,r.field2PercentSkala
from ranged r
where r.rn =1

select top 1 with ties
	t1.field1Name
	,t1.field2PercentSkala
from	@t1 t1
		inner join @t2 t2
		on	t2.filed1Name = t1.field1Name
			and t2.field2Percent>=t1.field2PercentSkala							
order by ROW_NUMBER() over (partition by t1.field1Name order by t1.field2PercentSkala desc)	
18 май 12, 14:44    [12577374]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос без цикла  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
мимо,

если будет индекс
create index ix_t1_field1Name_percent ON t1 (field1Name,field2Percent)

то
автор
b.field2Percent -a.field2PercentSkala >= 0

имхо не даст в полной мере его использовать.
18 май 12, 14:47    [12577400]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос без цикла  [new]
RubinDm
Member

Откуда:
Сообщений: 461
student-uni,

группировки, максы и row_number'ы - имеют право быть, но имхо дороговато.
можно написать запрос ровно так, как поставлена задача, т.е. почти дословно, только на SQL:

-- готовим данные

declare @t1 table(field1Name varchar(50),field2PercentSkala float)
insert into @t1(field1Name,field2PercentSkala)
values('Иванов', 1)
,('Иванов',2.5)
,('Иванов', 4)
,('Иванов', 5)

declare @t2 table(filed1Name varchar(50), field2Percent float) 
insert into @t2(filed1Name,field2Percent)
values('Иванов', 3)

-- собственно сам запрос

select t1.field1Name, t1.field2PercentSkala
from @t2 t2 -- По данным из таблицы 2
cross apply 
  ( select top 1 t.* -- найти первое значение
    from @t1 t -- из таблицы 1
    where t.field1Name = t2.filed1Name -- джоинить по полю filed1Name
      and t.field2PercentSkala <= t2.field2Percent -- значение превышенное либо равное
    order by t.field2PercentSkala desc -- макс окажется сверху, его выберет select top 1.
    -- так мы избавляемся от агрегации max(field2PercentSkala), ну и от group by.
  ) t1
18 май 12, 14:58    [12577525]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить