首页 > 解决方案 > 获取sql server中列的最后一个值

问题描述

我想获取列的最后一个值(它不是标识列)并将其递增到生成的相应行号的值。

Select isnull(LAST_VALUE(ColumnA) over(order by ColumnA), 0) + 
       ROW_NUMBER() OVER (ORDER BY ColumnA)
from myTable

我递归地调用我的 sp,因此我想到了这个逻辑。但它不起作用。

我基本上想要,第一次 1-9 第二次运行(如果递归地被调用 2 次)10-19 等等。

标签: sqlsql-servertsql

解决方案


在黑暗中完全刺伤,但我怀疑“不工作”意味着“返回当前行的值”。不要忘记,当未明确指定子句并且存在子句时,OVER子句默认为窗口(请参阅SELECT - OVER Clause (Transact-SQL) - ORDER BY)。RANGE BETWEEN PRECEDING AND CURRENT ROWORDER BY

订购方式

ORDER BY *order_by_expression* [COLLATE *collation_name*] [ASC|DESC]  

定义结果集的每个分区内行的逻辑顺序。也就是说,它指定了执行窗口函数计算的逻辑顺序。

  • 如果未指定,则默认顺序为ASC,窗口函数将使用分区中的所有行。
  • 如果已指定,但未指定ROWS/ RANGE,则默认值将由可以接受可选/规范(例如 min 或 max)RANGE UNBOUNDED PRECEDING AND CURRENT ROW的函数用作窗口框架的默认值。ROWSRANGE

由于您尚未定义窗口,这就是您的LAST_VALUE函数正在使用的。定义您想要分区的全部内容:

SELECT ISNULL(LAST_VALUE(ColumnA) OVER (ORDER BY ColumnA ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING), 0) + 
       ROW_NUMBER() OVER (ORDER BY ColumnA)
FROM dbo.myTable;

虽然戈登在他们的评论中说的是真正的解决方案:

您应该使用identity列或sequence.

这种类型的解决方案可能(并且将会)最终遭受竞争条件,并最终在不应该的情况下重用“身份”。


推荐阅读