2016-03-21 8 views
0

Beginnend mit einer Tabelle mit timestamp und einem (geografischen) point, Daten werden empfangen und ungeordnet (dh Identität Spalte ist keine gute Option).
Ich muss eine Berechnung mit Informationen aus der unmittelbaren vorherigen Reihe in der Zeit, (sortiert nach timestamp), dann die Zeit und die point, um die Segmentgeschwindigkeit zu berechnen.So finden Sie die vorherige Zeile mit Zeitstempel

Das nächste Beispiel nehme an, dass ich eine eindeutige ID in der Tabelle namens [Punkt] habe.

SELECT point.STDistance(
     (SELECT point FROM [Spot] WHERE id=(s.id + 1))) 
     /datediff(ss,[timestamp], 
      (SELECT [timestamp] FROM [Spot] where id=(s.id + 1))) 
FROM [Spot] s WHERE id= 21927 

Jeder bessere Vorschlag?

+0

'Zeitstempel': eine Benutzerspalte mit der Abtastzeit. Die Proben werden nicht in der Reihenfolge "Zeit" gesendet. – fcm

Antwort

0

wenn die ID könnte Ihnen helfen, die vorherige Zeile finden Ich schlage vor, Sie nicht Zeitstempel verwendet, es zu finden

versuchen beitreten:

select t2.point/datediff(ss,t1.timestamp,t2.timestamp) 
from spot t1 
join spot t2 
on t1.id = t2.id-1 

aber ich kann nicht wirklich lesen Sie Ihre Abfrage ist es ein wenig Etwas unordentlich. Also habe ich das mit meinem eigenen Verständnis gemacht.

0

Ich muß eine Berechnung mit den Daten von der unmittelbar vorangehenden Zeile in der Zeit durchzuführen, (von Zeitpunkt sortierte) ... unten ist eine Möglichkeit, unmittelbar vorangehende Zeile zu berechnen

with cte 
    as 
    (select timestamp,max(timestamp) over(partition by timestamp 
            order by timestamp 
            rows between unbounded preceeding and current row) as maxrow 
    from table 
    ) 

dann datediff berechnen ..

select point/datediff(ss,cte.timestamp,cte.maxrow) from 
cte c 
join 
table t on 
t.timestamp.cte.timestamp 

Sie sollten auch einen Fall hinzufügen, um sicherzustellen, dass Sie nicht Division durch Null-Ausnahme zu tun, etwas, was wie unten ..

select case when datediff(ss,cte.timestamp,cte.maxrow)=0 then 0 
else point/datediff(ss,cte.timestamp,cte.maxrow) 
0

Verwendung des Windows-Funktionen:

select ... datediff(ss, lag(timestamp) over(order by timestamp), timestamp) ... 
0

Nach ein paar Einschränkungen, das ist die Art und Weise funktioniert für mich:

DECLARE @tmp table(
     id int identity(1,1), 
     [point] geography, 
     [timestamp] datetime) 

    INSERT @tmp 
    SELECT[point],[timestamp] from [Spot] order by [timestamp] desc 

    SELECT p1.[point],p1.[timestamp],p2.[point], 
    p2.[timestamp], 
    p1.point.STDistance(p2.point), 
    DATEDIFF(s,p2.[timestamp],p1.[timestamp]) 
    FROM @tmp p1 left join @tmp p2 on p1.id=p2.id-1 

A zwischen der aktuellen Zeile und der nächsten Zeile Werke verbinden und erhalten das erwartete Ergebnis .

Verwandte Themen