Выбор верхних 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