如何使用时间戳

时间:2016-03-21 05:44:45

标签: sql sql-server tsql

从包含timestamp和(地理位置)point的表开始,接收数据并填充无序数据(因此,标识列不是一个好选项)。
我需要使用前一个时间行的信息(按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

有更好的建议吗?

4 个答案:

答案 0 :(得分:0)

如果id可以帮助您找到上一行,我建议您不要使用时间戳来找到它

尝试加入:

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

但我无法真正阅读你的查询它有点混乱。所以我按照自己的理解做到了这一点。

答案 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
    )

然后计算dateiff ..

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)

答案 2 :(得分:0)

使用窗口函数:

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

答案 3 :(得分: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

当前行和下一行之间的连接起作用并获得预期结果。