0

我在 SQL Server2008 R2 中有大约 5300 万行。我想添加一个名为Direction. 方向的值依赖于前几行的坐标,其中进行了简单的计算以确定每个唯一标识符的坐标变化。

如何使用 SQL 脚本和/或语句来实现这一点?

4

2 回答 2

4

您真正想要做的是使用新的LAGLEAD功能,但由于这些仅在 SQL Server 2012 中可用,您需要找到另一种方法。

这里有一篇博客文章讨论了模拟LAG和的五种方法:http LEAD: //blog.sqlauthority.com/2011/11/24/sql-server-solution-to-puzzle-simulate-lead-and-lag-without-使用-sql-server-2012-analytic-function/

于 2012-06-18T09:54:38.490 回答
1

这需要在表上进行自联接,我相信您已经想通了。如果您的唯一标识符不是连续的,那么您必须使用该ROW_NUMBER函数创建一个连续的行号,否则您可以使用唯一标识符。

这是我的测试表,只是为了给你上下文......

CREATE TABLE #test(
    test_key INT PRIMARY KEY CLUSTERED,
    lat float,
    lon float,
    direction float
)

如果主键不是顺序的,则需要 user 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
于 2012-06-18T16:02:59.023 回答