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

Откуда: Пхеньян
Сообщений: 141
create table aa
(
dt datetime,
val1 int,
val2 int
)

insert into aa values
(0, 1, 2),
(1, 1, 3),
(2, 1, 4),
(3, 2, 1),
(4, 2, 2)

select * from aa

select dt, val1 from (
select *,MAX(val2)over(partition by val1)v from aa
)x where val2=v

drop table aa


как в один запрос выбрать то же самое что сделано в два - выбрать дату для каждого val1 имеющего максимальный val2 в своей группе.

туплю..
3 дек 09, 22:46    [8017031]     Ответить | Цитировать Сообщить модератору
 Re: Одним запросом  [new]
пак и пак
Member [заблокирован]

Откуда: Пхеньян
Сообщений: 141
select dt, aa.val1 from aa join
(
select val1, MAX(val2) val2
from aa
group by val1
)x on aa.val1=x.val1 and aa.val2=x.val2

тоже в 2..

но в один вроде не получится.
3 дек 09, 22:51    [8017049]     Ответить | Цитировать Сообщить модератору
 Re: Одним запросом  [new]
Ozzy-Osbourne
Member

Откуда: Balashikha
Сообщений: 139
пак и пак
как в один запрос выбрать то же самое что сделано в два - выбрать дату для каждого val1 имеющего максимальный val2 в своей группе
если фраза "в один запрос" означает за одно обращение к таблице, то попробуйте так:

1) test data
+
declare @t table(dt datetime,val1 int,val2 int)
insert into @t(dt,val1,val2)values('20090119', 1, 2)
insert into @t(dt,val1,val2)values('20090523', 1, 3)
insert into @t(dt,val1,val2)values('20051016', 1, 7)
insert into @t(dt,val1,val2)values('20091231', 1, 1)

insert into @t(dt,val1,val2)values('20070223', 2, 4)
insert into @t(dt,val1,val2)values('20070614', 2, 5)
insert into @t(dt,val1,val2)values('20091127', 2, 3)
insert into @t(dt,val1,val2)values('20091227', 2, 1)

insert into @t(dt,val1,val2)values('20030619', 3, 6)
insert into @t(dt,val1,val2)values('20080827', 3, 2)
insert into @t(dt,val1,val2)values('20090929', 3, 9)
insert into @t(dt,val1,val2)values('20100927', 3, 4)
2) query:
select val1,date4max=cast(right(max(cast(1000000000+val2 as char(10))+convert(char(8),dt,112)),8) as datetime)
from @t
group by val1
3) result:
val1date4max
12005-10-16 00:00:00.000
22007-06-14 00:00:00.000
32009-09-29 00:00:00.000
4 дек 09, 00:43    [8017263]     Ответить | Цитировать Сообщить модератору
 Re: Одним запросом  [new]
пак и пак
Member [заблокирован]

Откуда: Пхеньян
Сообщений: 141
SELECT TOP(1)	WITH TIES
		dt,
		val1,
		val2
FROM		aa
ORDER BY	val1 * val2 DESC
4 дек 09, 00:46    [8017270]     Ответить | Цитировать Сообщить модератору
 Re: Одним запросом  [new]
пак и пак
Member [заблокирован]

Откуда: Пхеньян
Сообщений: 141
Ozzy-Osbourne
select val1,date4max=cast(right(max(cast(1000000000+val2 as char(10))+convert(char(8),dt,112)),8) as datetime)
from @t
group by val1


тоже супер вариант
4 дек 09, 00:55    [8017285]     Ответить | Цитировать Сообщить модератору
 Re: Одним запросом  [new]
iljy
Member

Откуда:
Сообщений: 8711
пак и пак
SELECT TOP(1)	WITH TIES
		dt,
		val1,
		val2
FROM		aa
ORDER BY	val1 * val2 DESC

Не покатит Попробуйте на данных (0,1,3),(1,2,2)
4 дек 09, 00:59    [8017290]     Ответить | Цитировать Сообщить модератору
 Re: Одним запросом  [new]
пак и пак
Member [заблокирован]

Откуда: Пхеньян
Сообщений: 141
iljy,

Блин, конечно, я уже потом допёр :)

Просто так данные совпали..

Тупил.
4 дек 09, 01:05    [8017298]     Ответить | Цитировать Сообщить модератору
 Re: Одним запросом  [new]
Robb
Member

Откуда: там и тут
Сообщений: 949
тогда так:

SELECT TOP(1) WITH TIES dt, val1
FROM aa
ORDER BY ROW_NUMBER() OVER(PARTITION BY val1 ORDER BY val2 DESC)
4 дек 09, 01:30    [8017313]     Ответить | Цитировать Сообщить модератору
 Re: Одним запросом  [new]
пак и пак
Member [заблокирован]

Откуда: Пхеньян
Сообщений: 141
Robb,

круто, спасибо.
4 дек 09, 01:40    [8017320]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Одним запросом  [new]
.NET
Member

Откуда: Москва->Петушки
Сообщений: 8258
Хорошее решение.
А как сюда ещё бы having навернуть?
Например хочу выбрать только такие группы у которых max(val1) > 3.
20 июл 11, 13:53    [10999993]     Ответить | Цитировать Сообщить модератору
 Re: Одним запросом  [new]
.NET
Member

Откуда: Москва->Петушки
Сообщений: 8258
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) Apr 2 2010 15:48:46 Copyright (c) Microsoft Corporation Developer Edition (64-bit) on Windows NT 5.2 <X64> (Build 3790: Service Pack 2)
20 июл 11, 13:53    [11000004]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить