有没有办法访问 SELECT 语句中的“上一行”值?

新手上路,请多包涵

我需要计算表格两行之间一列的差异。有什么方法可以直接在 SQL 中执行此操作吗?我正在使用 Microsoft SQL Server 2008。

我正在寻找这样的东西:

 SELECT value - (previous.value) FROM table

想象一下“previous”变量引用了最新选择的行。当然,通过这样的选择,我最终会在一个有 n 行的表中选择 n-1 行,这不是可能的,实际上正是我需要的。

这在某种程度上可能吗?

原文由 Edwin Jarvis 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 481
2 个回答

SQL 没有内置的顺序概念,因此您需要按某个列进行排序才能有意义。像这样的东西:

 select t1.value - t2.value from table t1, table t2
where t1.primaryKey = t2.primaryKey - 1

如果您知道如何排序,但不知道如何在给定当前值的情况下获取前一个值(EG,您想按字母顺序排序),那么我不知道在标准 SQL 中这样做的方法,但大多数 SQL 实现都会有扩展来做到这一点。

如果您可以对行进行排序以使每个行都不同,那么这是一种适用于 SQL Server 的方法:

 select  rank() OVER (ORDER BY id) as 'Rank', value into temp1 from t

select t1.value - t2.value from temp1 t1, temp1 t2
where t1.Rank = t2.Rank - 1

drop table temp1

如果您需要打破平局,您可以根据需要向 ORDER BY 添加尽可能多的列。

原文由 RossFabricant 发布,翻译遵循 CC BY-SA 2.5 许可协议

您可以使用以下函数获取当前行值和上一行值:

 SELECT value,
min(value) over (order by id rows between 1 preceding and 1
preceding) as value_prev
FROM table

然后你可以从该选择中选择 value - value_prev 并得到你的答案

原文由 TK-421 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进