2017-06-18 11 views
0

Ich habe eine Tabelle wie folgt tt genannt für jede Namedie letzte Zeile vor einem bestimmten Zeitstempel Auswählen

ID|Name|Date|Value| 
------------------------------------ 
0| S1| 2017-03-05 00:00:00| 1.5| 
1| S1| 2017-04-05 00:00:00| 1.2| 
2| S2| 2017-04-06 00:00:00| 1.2| 
3| S3| 2017-04-07 00:00:00| 1.1| 
4| S3| 2017-05-07 00:00:00| 1.2| 

Ich muss die Zeile mit der höchsten Zeit auswählen, die < theTime

theTime ist ist nur eine Variable mit dem Zeitstempel. In dem Beispiel könnten Sie eine Datumszeichenkette, z.B. < DATE '2017-05-01' Ich werde den Wert der Variablen später programmgesteuert mit einer anderen Sprache

injizieren Ich habe eine schwierige Zeit herausfinden, wie man das macht ... weiß jemand?

Ich würde auch gern wissen, wie ich das auswählen soll, was ich oben beschrieben habe, aber beschränkt auf eine spezifische name, z.B. name='S3'

Antwort

1

Es wäre schön, wenn hsqldb wirklich row_number() unterstützt:

select t.* 
from (select tt.*, 
      row_number() over (partition by name order by date desc) as seqnum 
     from tt 
     where . . . 
    ) t 
where seqnum = 1; 

Ohne dass, verwenden Sie einen group by und join:

select tt.* 
from tt join 
    (select name, max(date) as maxd 
     from tt 
     where date < THETIME 
     group by name 
    ) ttn 
    on tt.name = ttn.name and tt.date = ttn.maxd; 

Hinweis: Diese Duplikate zurück, wenn die maximale Datum Duplikate hat für einen bestimmten Namen.

Die where hat die Begrenzung für Ihren Zeitstempel.

+0

Ich denke zum Glück, das kann nie passieren für mich in meiner Datenbank (doppelte Daten für den Vornamen) – ycomp

Verwandte Themen