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

Откуда: от верблюда
Сообщений: 428
Даны таблицы
A - master
IDAF1
11
210
3250
420
5271


B- slave
IDAIDBF1
1110
225
3215
43200
53300
6430
75250


задача - найти максимальное значение BF1 в разрезе AID, которое меньше или равно значению AF1
для данного примера результат должен быть таким:
AIDAF1BF1
2105
3250200
5271250


заранее спасибо!
27 сен 12, 10:48    [13230163]     Ответить | Цитировать Сообщить модератору
 Re: Как найти максимальныое значение в таблице B для каждого элемента таблицы A?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
TJ001
Даны таблицы
A - master
IDAF1
11
210
3250
420
5271


B- slave
IDAIDBF1
1110
225
3215
43200
53300
6430
75250


задача - найти максимальное значение BF1 в разрезе AID, которое меньше или равно значению AF1
для данного примера результат должен быть таким:
AIDAF1BF1
2105
3250200
5271250


заранее спасибо!

Если я правильно понял то
declare @A table (ID int,AF1 int);
insert @A values(1,1),(2,10),(3,250),(4,20),(5,271);
declare @B table (ID int,AID int, BF1 int);
insert @B values (1,1,10),(2,2,5),(3,2,15),(4,3,200),(5,3,300),(6,4,30),(7,5,250),(8,3,210);

with cte as
(
select
	b.*,
	rn = row_number() over(partition by b.AID order by b.BF1 desc)
from
	@A a
	join @B b on a.ID = b.AID
where
	b.BF1 <= a.AF1
)
select cte.ID, cte.AID, cte.BF1 from cte where rn = 1
27 сен 12, 11:13    [13230337]     Ответить | Цитировать Сообщить модератору
 Re: Как найти максимальныое значение в таблице B для каждого элемента таблицы A?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
SomewhereSomehow,

к сожалению у меня SQL2000 и выражение with over не поддерживается. я плохо представляю как они это работают и потренироваться не на чем :'(
27 сен 12, 11:22    [13230416]     Ответить | Цитировать Сообщить модератору
 Re: Как найти максимальныое значение в таблице B для каждого элемента таблицы A?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
TJ001,

declare @A table (ID int,AF1 int);
insert @A values(1,1),(2,10),(3,250),(4,20),(5,271);
declare @B table (ID int,AID int, BF1 int);
insert @B values (1,1,10),(2,2,5),(3,2,15),(4,3,200),(5,3,300),(6,4,30),(7,5,250),(8,3,210);

select
	b.AID,	
	AF1 = max(a.AF1),
	BF1 = max(b.BF1)
from
	@A a
	join @B b on a.ID = b.AID
where
	b.BF1 <= a.AF1
group by
	b.AID
27 сен 12, 11:28    [13230463]     Ответить | Цитировать Сообщить модератору
 Re: Как найти максимальныое значение в таблице B для каждого элемента таблицы A?  [new]
Anddros
Member

Откуда:
Сообщений: 1077
TJ001
SomewhereSomehow,

к сожалению у меня SQL2000 и выражение with over не поддерживается. я плохо представляю как они это работают и потренироваться не на чем :'(

Вот вам для 2000-го:
select A.ID, AF1, max(BF1) 
from @A A 
inner join @B B on A.ID = B.AID and AF1>=BF1
group by A.ID, AF1
27 сен 12, 11:28    [13230468]     Ответить | Цитировать Сообщить модератору
 Re: Как найти максимальныое значение в таблице B для каждого элемента таблицы A?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
спасибо огромное, друзья, вы мне очень помогли!
)
27 сен 12, 11:38    [13230534]     Ответить | Цитировать Сообщить модератору
 Re: Как найти максимальныое значение в таблице B для каждого элемента таблицы A?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
Забыл спросить, а если потребуется узнать ID таблицы B, при условии, что BF1 уникальны?
чтобы вот так это выглядело:
IDAIDAF1BF1
22105
43250200
75271250
27 сен 12, 14:24    [13232441]     Ответить | Цитировать Сообщить модератору
 Re: Как найти максимальныое значение в таблице B для каждого элемента таблицы A?  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
TJ001,

У вас может быть более одной строчки с максимальным значением.

Вы можете написать ещё один подзапрос и взять любой из идентификаторов min, max, у которого совпадает поле группировки с максимальным значением.

Так же можете подзапрос с top 1 order by ...
Так же можете аналог select ... from (row_number() .... as rn ...) where rn = 1 .
27 сен 12, 15:57    [13233451]     Ответить | Цитировать Сообщить модератору
 Re: Как найти максимальныое значение в таблице B для каждого элемента таблицы A?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
TJ001,

как-нибудь так можно
declare @A table (ID int,AF1 int);
insert @A values(1,1),(2,10),(3,250),(4,20),(5,271);
declare @B table (ID int,AID int, BF1 int);
insert @B values (1,1,10),(2,2,5),(3,2,15),(4,3,200),(5,3,300),(6,4,30),(7,5,250),(8,3,210);

select
	*	
from
	@A a
	join @B b on a.ID = b.AID
where
	b.BF1 <= a.AF1 and
	b.BF1 = (select BF1 = max(BF1) from @B b2 where b.AID = b2.AID and b2.BF1 <= a.AF1)
27 сен 12, 16:52    [13234010]     Ответить | Цитировать Сообщить модератору
 Re: Как найти максимальныое значение в таблице B для каждого элемента таблицы A?  [new]
TJ001
Member

Откуда: от верблюда
Сообщений: 428
значит я не ошибся
можно так
select b.id, a.id, a.amount, b.amount  from @a a
join @b b on a.id=b.id and b.amount = (select max(b1.amount) from @b b1 where b1.id=a.id and b1.amount <=a.amount)

или так
select * from (
select 
A.ID, 
a.amount, 
max(b.amount) as am
from @A A 
inner join @B B on A.ID = B.ID and a.amount>=b.amount and b.TableIndex = 1
group by A.ID, a.amount) c
join @b b on c.id = b.id and c.am = b.amount


reads одинаковое

план для 2го мне кажется как-то получше... а может и нет, не берусь утверждать.

еще раз всем спасибо за внимание!!!
27 сен 12, 17:08    [13234147]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить