2009-06-16 9 views
10

mam schemat podobny do następującego:Wybór N pierwszych rzędów w grupie klauzulą ​​

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

ja żądania lub tabelę, a powrót ostatniego 5 wierszy na przyrządzie.

mogę to zrobić instrumentu przez instrument z:

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

chciałbym to zrobić dla wszystkich instrumentów na raz w jednym zapytaniu. czy to możliwe? Używam SQL Server 2008.

+0

jaka wersja SQL Server? –

+0

SQL Server 2008 - dodano do pytania. – Jon

Odpowiedz

12

CROSS APPLY jest jak zwykle to zrobić - http://msdn.microsoft.com/en-us/library/ms175156.aspx

EDIT - dodaj przykład, tak:

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 

Zazwyczaj co chcesz dodać zamówienie tam.

Edytuj - dodano różne do zapytania, mam nadzieję, że daje to, czego chcesz. Edytuj - dodano brakujące słowo kluczowe "select" u góry strony. skopiuj & wklej błąd FTL!

+0

To nie wydaje się działać dla mnie. Dostaję wiele zduplikowanych wierszy, ponieważ myślę, że zastosowanie jest wykonywane w każdym wierszu tabeli słupkowej? – Jon

+0

@jon - oops, nie miałem żadnych danych testowych pod ręką, więc nie mogłem zweryfikować wysłanego przeze mnie zapytania. Prawdopodobnie najprostszym jest odróżnienie elementu bar1.instrument w podzapytaniu. Zaktualizuję przykład. – ahains

+0

@hainstech działa teraz dobrze, ale brakuje ci wybrania u góry. – Jon

7

użyciu SQL 2008, można użyć klauzuli numer wiersza partycje z 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 
+0

To działa ładnie. Mam jeden problem, że moja tablica słupkowa jest dość duża (miliony wierszy), a plan kwerendy do tego wydaje się sortować całą tabelę. Czy istnieje sposób na zoptymalizowanie tego? Górne rzędy "5" reprezentują niewielki procent tabeli (<1%). – Jon

Powiązane problemy