我有类似于以下的架构:
create table bar
(
instrument varchar(255) not null,
bar_dttm datetime not null,
bar_open int not null,
bar_close int not null
)
Run Code Online (Sandbox Code Playgroud)
我想查询表,并返回每个仪器最近的5行.
我可以通过仪器来做,有:
select top 5 instrument, bar_dttm, bar_open, bar_close
from bar
where instrument = 'XXX'
order by bar_dttm desc
Run Code Online (Sandbox Code Playgroud)
我想在一次查询中同时为所有仪器执行此操作.这可能吗?我正在运行SQL Server 2008.
aha*_*ins 12
CROSS APPLY就是你通常的做法 - http://msdn.microsoft.com/en-us/library/ms175156.aspx
编辑 - 添加示例,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
通常,您希望在那里添加订单.
编辑 - 为查询添加了不同的内容,希望这可以让您想要.修改 - 在顶部添加了缺少的"select"关键字.复制并粘贴bug FTL!
使用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
Run Code Online (Sandbox Code Playgroud)