2016-03-21 18 views
0

timestamp ve (coğrafi) point numaralı bir tablodan başlayarak, veriler alındı ​​ve sıralanmamış olarak doldurulur (bu nedenle, kimlik sütunu iyi bir seçenek değildir).
Hemen önceki sıradaki bilgilerle (timestamp sıralanır), daha sonra da zaman dilimini ve point segment hızını hesaplamak için bir hesaplama yapmam gerekiyor.Zaman damgası kullanılarak önceki satırın nasıl bulunacağı

Bir sonraki örnekte, [spot] adında benzersiz bir kimliğim olduğunu varsayalım.

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 

Daha iyi bir öneri?

+0

'timestamp': örnek zamana sahip bir kullanıcı sütunu. Numuneler 'zaman' sırasına göre gönderilmez. – fcm

cevap

0

id i bunu

katılmak deneyin bulmak için zaman damgası kullanılmıyor varsayılır Önceki satırı bulmak için yardımcı olabilir:

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

ama gerçekten biraz var Sorgunuzla okuyamaz messy.so bunu kendi anlayışımla yaptım.

0

Ben zaman, (zaman damgası göre sıralı olarak) hemen önceki satırdan bilgi içeren bir hesaplama yapmak gerekiyor ... Aşağıda

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 
    ) 

sonra datediff hesaplamak hemen önceki satır hesaplamak için tek yoldur ..

select point/datediff(ss,cte.timestamp,cte.maxrow) from 
cte c 
join 
table t on 
t.timestamp.cte.timestamp 
Ayrıca sıfır istisna, aşağıda gibi bazı şey ile böl alamadım emin olmak için bir dava eklemek gerekir

..

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

Kullanım Pencere Fonksiyonlar: Birkaç uyarılar sonra

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

, bu şekilde benim için çalışıyor:

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 

bir akım satır ve sonraki satır eserleri arasında birleştirme ve beklenen sonuç almak .