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

Откуда:
Сообщений: 12310
Есть таблица
create table t1(
    id            int,
    group_id      int,
    dt            datetime
)

Тестовые данные:
insert into t1 values (1,  1, '20040101')
insert into t1 values (2,  1, '20040110')
insert into t1 values (3,  1, '20040108')
insert into t1 values (4,  1, '20040106')
insert into t1 values (5,  1, '20040105')
insert into t1 values (6,  2, '20040111')
insert into t1 values (7,  2, '20040102')
insert into t1 values (8,  2, '20040103')
insert into t1 values (9,  2, '20040109')
insert into t1 values (10, 2, '20040108')

Надо выбрать N самых поздних по дате записей из каждой группы.

То есть из тестовых данных при N=2 надо получить
2
3
6
9
23 авг 04, 14:48    [901366]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать TOP N с упорядочением из каждой группы  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
даты повторяться могут для каждой группы?


для спящего время бодрствования равносильно сну
23 авг 04, 15:05    [901444]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать TOP N с упорядочением из каждой группы  [new]
iSestrin
Member

Откуда: Новосибирск
Сообщений: 3811
select t.* from @t1 t where id in (select top 2 id from @t1 where group_id=t.group_id order by dt desc)
23 авг 04, 15:06    [901450]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать TOP N с упорядочением из каждой группы  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
пока что только такая мысля...
declare @n int
set @n = 2
create table #t (id int identity(1,1), idp int, i int, group_id int)
insert into #t (idp, i, group_id)
select id, 0, group_id
 from t1 t
 order by group_id, dt desc, id
update t set i = (select count(*) from t1 t1 where t1.group_id = t.group_id and t1.id<=t.id having count(*)<=@n) from #t t
select t1.* from #t t join t1 on t1.id = t.idp and t.i is not null
drop table #t

для спящего время бодрствования равносильно сну
23 авг 04, 15:13    [901491]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать TOP N с упорядочением из каждой группы  [new]
Jem
Member

Откуда:
Сообщений: 735
Еще одна мысль без временных таблиц, но видимо чтобы избавиться от Null надо всю конструкцию загонять в подзапрос, чтобы сделать New_Id Is Not NULL
DECLARE @N int
Set @N=3
SELECT t1.id, t1.group_id, t1.dt, (SELECT MAX(t2.Id) FROM t1 t2 WHERE 
t2.dt>=t1.dt and t1.group_id=t2.group_id
HAVING COUNT (t2.id)<@N) New_Id
 FROM t1 
ORDER BY  dt DESC
23 авг 04, 15:21    [901521]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать TOP N с упорядочением из каждой группы  [new]
Александр Азаркович
Member

Откуда:
Сообщений: 208
select id from t1
where
(select count(id) from t1 as t2
	where t1.group_id=t2.group_id 
	and t1.dt <= t2.dt)<=2
23 авг 04, 15:28    [901552]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать TOP N с упорядочением из каждой группы  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
вот и другая мысля
declare @n int
set @n = 2
select t.id, t.group_id, t.dt
 from t1 t
  join t1 t2 on t2.group_id = t.group_id and t2.dt>=t.dt
 group by t.id, t.group_id, t.dt
 having count(*) <= @n

для спящего время бодрствования равносильно сну
23 авг 04, 15:37    [901601]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать TOP N с упорядочением из каждой группы  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Jem, ваш запрос выдает нечто странное.
Остальные работают, но по-разному с NULL'ами.

2 All: спасибо. Надо будет еще разобраться с NULL'ами, нужны ли они в данной задаче и т.д. Но это я уж догоню :-) Спасибо за помощь!
23 авг 04, 16:51    [901963]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить