2009-06-16 13 views
10

Ich habe Schema ähnlich den folgenden:innerhalb einer Gruppe, die die Top-n Zeilen Auswahl von Klausel

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

Ich mag die Tabelle abzufragen, und gibt die letzten 5 Zeilen pro Instrument.

ich es kann durch Instrument Instrument tun, mit:

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

Ich mag würde dies in einer Abfrage auf einmal für alle Instrumente zu tun. Ist das möglich? Ich bin mit SQL Server 2008.

+0

, welche Version von SQL Server? –

+0

SQL Server 2008 - zur Frage hinzugefügt. – Jon

Antwort

12

CROSS APPLY ist, wie Sie in der Regel das tun - http://msdn.microsoft.com/en-us/library/ms175156.aspx

EDIT - fügen Beispiel so etwas wie dieses:

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 

Normalerweise würden Sie eine Bestellung hinzufügen möchten, indem da drin.

Edit - deutlich zur Abfrage hinzugefügt, hoffentlich, dass Sie wollen, dass Sie wollen. Bearbeiten - Fehlendes Keyword "Auswählen" oben hinzugefügt. Kopieren & einfügen Fehler FTL!

+0

Das scheint bei mir nicht zu funktionieren. Ich bekomme viele doppelte Zeilen zurück, da ich denke, dass die Anwendung in jeder Zeile der Stabtabelle ausgeführt wird? – Jon

+0

@jon - oops, hatte keine Testdaten zur Hand, also konnte ich die Abfrage, die ich geschrieben habe, nicht validieren. Das einfachste ist es, in einer Unterabfrage ein distinct auf bar1.instrument zu machen. Ich werde das Beispiel aktualisieren. – ahains

+0

@hainstech funktioniert jetzt gut, aber Sie verpassen eine Auswahl an der Spitze. – Jon

7

mit SQL 2008 Sie eine partitionierte Zeilennummer Klausel mit einem WAK ...

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

Das funktioniert gut. Ein Problem, das ich habe, ist, dass meine Stabtabelle ziemlich groß ist (Millionen von Zeilen) und der Abfrageplan dafür scheint die gesamte Tabelle zu sortieren. Gibt es eine Möglichkeit, dies zu optimieren? Die obersten '5' Zeilen repräsentieren einen kleinen Prozentsatz der Tabelle (<1%). – Jon

Verwandte Themen