You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 18:20:57