我在 SQL Server2008 R2 中有大约 5300 万行。我想添加一个名为Direction
. 方向的值依赖于前几行的坐标,其中进行了简单的计算以确定每个唯一标识符的坐标变化。
如何使用 SQL 脚本和/或语句来实现这一点?
我在 SQL Server2008 R2 中有大约 5300 万行。我想添加一个名为Direction
. 方向的值依赖于前几行的坐标,其中进行了简单的计算以确定每个唯一标识符的坐标变化。
如何使用 SQL 脚本和/或语句来实现这一点?
您真正想要做的是使用新的LAG
和LEAD
功能,但由于这些仅在 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/
这需要在表上进行自联接,我相信您已经想通了。如果您的唯一标识符不是连续的,那么您必须使用该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