2009-06-16 68 views
10

選擇一個組中的前n行我有類似以下模式:by子句

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的

+0

什麼版本的SQL Server? – 2009-06-16 21:39:33

+0

SQL Server 2008 - 添加到問題。 – Jon 2009-06-16 21:41:16

回答

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 

通常你會希望通過增加訂單在那裏。

編輯 - 添加不同的查詢,希望可以讓你想要你想要的。 編輯 - 在頂部添加缺少「選擇」關鍵字。複製&粘貼錯誤FTL!

+0

這似乎不適用於我。我認爲應用程序在條形表中的每一行上執行時,我得到很多重複的行? – Jon 2009-06-16 22:09:29

7

使用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