Помогити написать запрос

iKeith
Дата: 27.01.2009 02:49:10
В sql'е не мастер, поэтому прошу помощи у многоуважаемой общественности:

Есть таблица "table1", которая имеет два столбца:

ID int
Start DateTime

Нужно написать примерно следующий запрос:

select top 10 *
from table1 t
where ((t.ID = 1) or (t.ID = 2))
and (t.Start >= '01/26/2009 2:20:16')
order by t.Start desc

только в данном случае произойдет выбор 10 последних записей для любого t, имеющего ID равное 1 или 2, а хочется, чтобы 10 последних запросов были получены для каждого из перечисленных ID.
Т.е. задача состоит в том, чтобы получить по 10 последних записей для каждого из перечисленных t.ID.

Это вообще возможно сделать одним запросом или надо делать на каждый ID по запросу?
aleks2
Дата: 27.01.2009 06:28:06
Если в таблице будет примару кей или уникальный индекс - можно.
aleks2
Дата: 27.01.2009 06:31:51
А впрочем, можно и так

select * 
from table1 t
where Start in (select  top 10 Start FROM table1 x WHERE x.ID = t.ID ORDER BY Start)
-- ниже - это перестраховка
and exists(select * FROM FROM table1 y WHERE y.ID = t.ID AND y.Start=t.Start)
iap
Дата: 27.01.2009 08:49:18
SQL2005
select top 1 with ties * 
from table1
where ID in(1,2) and Start>='20090126 2:20:16'
order by row_number()over(partition by ID order by Start desc)/11;
SQL2005
with cte as
(
 select  row_number()over(partition by ID order by Start desc) n, * 
 from table1
 where ID in(1,2) and Start>='20090126 2:20:16'
)
select * from cte where n<=10;
iKeith
Дата: 27.01.2009 21:22:31
Спасибо aleks2 и iap!
К сожалению, приведенные варианты не очень подходят, т.к. в первом случае будет фактически по запросу на каждый ID, а второй случай работает только в ms sql.
Придется мне слегка пересмотреть архитектуру...
iap
Дата: 27.01.2009 21:38:18
iKeith
Спасибо aleks2 и iap!
К сожалению, приведенные варианты не очень подходят, т.к. в первом случае будет фактически по запросу на каждый ID, а второй случай работает только в ms sql.
Придется мне слегка пересмотреть архитектуру...
IMHO, вариант с CTE должен работать не только в MSSQL! Ибо соответствует ANSI SQL 1999
Попробуйте в Oracle 10g (естественно, никаких гарантий дать не могу, в Oracle полный "чайник" )