从包含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
有更好的建议吗?
答案 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
当前行和下一行之间的连接起作用并获得预期结果。