我在SQL Server2008 R2中有大约5300万行。我想添加一个名为Direction
的列。方向值依赖于先前行的坐标,其中进行简单计算以建立每个唯一标识符的坐标变化。
如何使用SQL脚本和/或语句实现此目的?
答案 0 :(得分:4)
您真正想要做的是使用新的LAG
和LEAD
函数,但由于这些函数仅在SQL Server 2012中可用,因此您需要找到另一种方法。
此处有一篇博客文章讨论了模拟LAG
和LEAD
的五种方法:http://blog.sqlauthority.com/2011/11/24/sql-server-solution-to-puzzle-simulate-lead-and-lag-without-using-sql-server-2012-analytic-function/
答案 1 :(得分:1)
这需要在桌面上进行自我加入,因为我相信你已经想通了。如果您的唯一标识符不是连续的,那么您必须使用ROW_NUMBER
函数创建顺序行号,否则您可以使用唯一标识符。
这是我的测试表,只是为了给你上下文......
CREATE TABLE #test(
test_key INT PRIMARY KEY CLUSTERED,
lat float,
lon float,
direction float
)
如果主键不是连续的,则需要用户ROW_NUMBER
。以下是此方案的示例。我假设你正试图在顺时针方向偏离北方时获得方向。 ATN2
将向东逆时针方向返回轴承,所以我交换了X和Y坐标将基础移动到北方,并否定了结果以纠正方向。这应该会给你一个很好的开端。不过请注意,此示例lon
,lat
和生成的direction
都是弧度。您可能需要将这些转换为度数,正如我在第二个示例中所做的那样。
;WITH cte AS (SELECT ROW_NUMBER() OVER (ORDER BY test_key) AS seq, test_key, lat, lon, direction FROM #test)
UPDATE t SET direction = -ATN2(c2.lon-c1.lon, c2.lat-c1.lat)
FROM #test t, cte c1, cte c2
WHERE t.test_key = c1.test_key
AND c2.seq = c1.seq + 1
第二个示例假设一个顺序主键,以及度,方向,纬度和经度。
UPDATE t1 SET direction = -ATN2((t2.lon-t1.lon)*pi()/180.0, (t2.lat-t1.lat)*pi()/180.0)*180.0/pi()
FROM #test t1, #test t2
WHERE t2.seq = t1.seq + 1