2016-11-17 4 views
3

In meiner SQL-Server-Datenbank gibt es eine Tabelle, in der jeder Tag viele Einträge für jeden Zeitwert (in ganzzahliger Form zB 800 -> 08:00) mit unterschiedlichen Beträgen hat und ein eindeutiges ID-Feld.Ergebnisse der sql while-Schleife in einer einzigen Tabelle anzeigen

Meine Tabelle sieht wie folgt aus:

ID  NTIME AMOUNT 
8426628 828  531.81 
8426629 828  782.61 
8426630 829  183.41 
8426631 829  183.41 
8426632 829  832.41 
8426633 829  32.41 
8426634 830  374.41 
8426635 830  78.41 
8426636 830  628.41 

Als Ergebnis habe ich die Zeilen mit dem Maximum-ID für jede einzelne Zeitwert erhalten möchten, wie folgt aus:

ID  NTIME AMOUNT 
8426629 828  782.61 
8426633 829  32.41 
8426636 830  628.41 

ich versucht habe, die folgende Abfrage:

DECLARE @t int=815; 
WHILE @t<=830 
    BEGIN 
    select ID, NTIME, AMOUNT FROM <my_table> WHERE 
     [email protected] and 
     ID = 
      (select max(ID) FROM <my_table> where [email protected]); 
    Set @t = @t + 1; 
    END 

Welche die richtigen Ergebnisse abruft, aber jedes ausgewählte Abfrageergebnis ist d in einer anderen Tabelle abgespielt (Ergebnis 1-1, Ergebnis 1-2 etc.). Gibt es eine Möglichkeit, die Ergebnisse in einer einzigen Ergebnistabelle zu erhalten, vorzugsweise ohne eine temporäre Tabelle zu erstellen?

Antwort

1

Sie können group by und Abfrage wie folgt verwendet werden:

select 
    T1.ID, 
    T1.NTIME, 
    T1.AMOUNT 
from 
(
    select NTIME, max(ID) as ID 
    from <my_table> 
    group by NTIME 
) as T 
left outer join <my_table> as T1 on T1.ID = T.ID and T1.NTIME = T.NTIME 

innere Abfrage Ausgänge max ID für jede einzelne NTIME und dann zu Tisch kommen zurück AMOUNT für diese Paare von ID zu erhalten und NTIME

1

Diese gibt Ihnen das gewünschte Ergebnis

+0

Nur als ein Punkt der pedantischen Klärung :-), ist es ein Missverständnis, dass CTEs muss ein Semikolon vorangestellt werden. Das Semikolon beendet die vorherige Anweisung (von der es in diesem Beispiel keine gibt). Beachten Sie auch, dass 'row_number()' keine Ranking-Funktion ist. 'rank()' und 'dose_rank()' sind. Ihre Daten sind weniger anfällig für Fehlinterpretationen, wenn Sie diese Spalte nicht rnk aufrufen. Etwas wie Seq oder Sequence_number könnte eine bessere Option sein. – DatumPoint

Verwandte Themen