2016-03-21 10 views
0

timestampと(地理的)pointのテーブルから始めて、データは受信され、順序付けられません(したがって、ID列は適切なオプションではありません)。
時間内に直前の行の情報を使って(timestampでソートして)計算を実行し、次にセグメント速度を計算するために時間とpointを計算する必要があります。タイムスタンプを使用して前の行を見つける方法

次の例では、[spot]という名前のテーブルに一意のIDがあると仮定しています。

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 

より良い提案はありますか?

+0

'timestamp':サンプル時間のユーザー列。サンプルは「時間」の順序ではなく送信されます。 – fcm

答えて

0

IDは、私はあなたはそれが

参加してみてください見つけるためにタイムスタンプを使用していないお勧め前の行を見つけるためにあなたを助けることができる場合:

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

が、私は本当にあなたのクエリを読み取ることができません、それは少しだが私は自分の理解でこれをしました。

0

私は時間(タイムスタンプでソート)に直前の行からの情報を用いて計算を実行する必要...以下

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 
    ) 

次いでDATEDIFFを計算する直前の行を計算する一つの方法である..

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

また、以下のようないくつかのこと、あなたがゼロ例外によって除算を取得しないことを確認するためにケースを追加する必要があります。..

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

使用ウィンドウ機能:いくつかの注意事項後

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

、これは方法ですが私の作品:

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は現在の行と次の行の作品間の結合と期待される結果を得ます。

関連する問題