SQL Server无分区时LAST_VALUE未返回预期值的原因咨询
LAST_VALUE函数结果不符合预期的原因及解决办法
问题根源
你执行的LAST_VALUE(PAST_DUE_COL) OVER (ORDER BY ID),默认的窗口范围是从结果集第一行到当前行(即RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)。也就是说,每一行的New_Due_Col只会取当前行及之前所有行里PAST_DUE_COL的最后一个值,而不是整个结果集的最后一行值。
比如你的数据按ID递增排序时,计算第1行的窗口只有第1行,就取第1行的PAST_DUE_COL值;计算第2行时窗口包含前2行,就取第2行的值;直到最后一行,窗口才覆盖所有行,这时才会显示你预期的'0-30 days past due'。这就是实际结果和预期不符的核心原因。
解决办法
要让所有行都拿到整个结果集的最后一个PAST_DUE_COL值,有几种可行方式:
方式1:显式指定完整窗口范围
直接把窗口范围设置为覆盖所有行:
SELECT t.*, LAST_VALUE(PAST_DUE_COL) OVER ( ORDER BY ID ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) AS New_Due_Col FROM mytableone t
方式2:用FIRST_VALUE配合倒序排序
倒序排序后取第一个值,等价于原顺序的最后一个值:
SELECT t.*, FIRST_VALUE(PAST_DUE_COL) OVER ( ORDER BY ID DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) AS New_Due_Col FROM mytableone t
方式3:用MAX函数简化(场景适配)
如果PAST_DUE_COL的最后一个值是你需要的全局唯一目标值,也可以直接用MAX()取全局值:
SELECT t.*, MAX(PAST_DUE_COL) OVER () AS New_Due_Col FROM mytableone t
内容的提问来源于stack exchange,提问作者Aswin K
相关产品推荐
相关产品推荐

