插入依赖于先前记录值的值

时间:2012-06-18 09:43:52

标签: sql sql-server sql-server-2008-r2

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

如何使用SQL脚本和/或语句实现此目的?

2 个答案:

答案 0 :(得分:4)

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

此处有一篇博客文章讨论了模拟LAGLEAD的五种方法: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坐标将基础移动到北方,并否定了结果以纠正方向。这应该会给你一个很好的开端。不过请注意,此示例lonlat和生成的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