Выбор верхних n строк в группе по предложению

У меня есть схема, подобная следующей:

create table bar
(
    instrument varchar(255) not null,
    bar_dttm datetime not null,
    bar_open int not null,
    bar_close int not null
)

Я хотел бы запросить таблицу и вернуть последние 5 строк на инструмент.

Я могу сделать это инструментом с помощью инструмента:

select top 5 instrument, bar_dttm, bar_open, bar_close
from bar
where instrument = 'XXX'
order by bar_dttm desc

Я хотел бы сделать это для всех инструментов сразу в одном запросе. Это возможно? Я запускаю SQL Server 2008.

Ответ 1

CROSS APPLY - это то, как вы обычно это делаете - http://msdn.microsoft.com/en-us/library/ms175156.aspx

EDIT - добавьте пример, что-то вроде этого:

select
    bar1.instrument
    ,bar2.*
from (
    select distinct instrument from bar) as bar1
cross apply (
    select top 5
        bar2.instrument
        ,bar2.bar_dttm
        ,bar2.bar_open
        ,bar2.bar_close 
    from bar as bar2 where bar2.instrument = bar1.instrument) as bar2

Обычно вам нужно добавить заказ.

Изменить - добавлен отличный от запроса, надеюсь, что вы захотите. Изменить - добавлено отсутствующее ключевое слово 'select' сверху. скопируйте и вставьте ошибку FTL!

Ответ 2

используя SQL 2008, вы можете использовать предложение номера разделенного ряда с помощью CTE...

with MyCte AS (SELECT      instrument, 
                           bar_dttm, 
                           bar_open, 
                           bar_close,
                           PartitionedRowNum = ROW_NUMBER() OVER (PARTITION BY instrument ORDER BY bar_dttm DESC)
               from        bar)
select  *
from    MyCte
where   PartitionedRowNum <= 5

Ответ 3

Также может использоваться Row_Number - http://msdn.microsoft.com/en-us/library/ms186734.aspx

WITH foo as (
Select
 *
 ,ROW_NUMBER() OVER(PARTITION BY instrument ORDER BY bar_dttm desc) as rank
from
 bar
)

select 
 *
from
 foo
where
 rank <= 5