使用子查询(Subquery)
WITH CTE AS (
SELECT
RowID,
Value,
ROW_NUMBER() OVER (ORDER BY RowID) AS RowNum
FROM
YourTable
)
SELECT
c1.RowID,
c1.Value,
c2.Value AS PrevValue
FROM
CTE c1
LEFT JOIN
CTE c2 ON c1.RowNum = c2.RowNum + 1;
WITH CTE AS (
SELECT RowID, Value, ROW_NUMBER() OVER (ORDER BY RowID) AS RowNum FROM YourTable )
SELECT c1.RowID, c1.Value, c2.Value AS PrevValue
FROM CTE c1
LEFT JOIN CTE c2
ON c1.RowNum = c2.RowNum + 1;
在某些特定场景下,也可以通过嵌套查询或窗口函数的前身——ROW_NUMBER()
函数配合子查询来实现类似效果。例如,为每一行分配一个行号,然后在外部查询中引用这个行号来获取前一行的数据:
这里创建了一个名为CTE
的公共表表达式,其中包含了原始表的行ID、值以及基于RowID
排序后的行号。然后通过外部查询将当前行与行号相差1的行进行连接,从而得到前一行的值。
子查询方法在SQL Server 2008中较为通用,但可能会在大数据集上导致性能下降。