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

如何在同一CTE作用域内访问刚创建的列实现rn累计计算

单CTE实现方案

你需要的累计计算逻辑本质是全局按日期、时间升序排序后,对每个日期分组内生成的顺序行号做逐行累计求和,不需要递归、不需要嵌套多层CTE,直接在单个CTE的SELECT子句中嵌套窗口函数即可实现,完全符合「同一CTE作用域内完成行号生成+累计计算」的要求。

实现代码

WITH cte AS(
    SELECT 
        _date,
        _time,
        SUM(ROW_NUMBER() OVER (PARTITION BY _date ORDER BY _time)) 
            OVER (ORDER BY _date, _time ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS rn
    FROM @sample    
)
SELECT * FROM cte

逻辑说明

  • 内层嵌套的ROW_NUMBER() OVER (PARTITION BY _date ORDER BY _time)完全沿用你原有的组内行号生成规则,按日期分组、时间升序生成每组内从1开始的连续序号
  • 外层的SUM() OVER (...)窗口定义全局排序规则为日期升序、时间升序,计算从结果集第一行到当前行的所有行号总和,这个计算逻辑和你描述的「逐行遍历,当前行最终值=自身原始行号+上一行计算后的值」完全等价,SQL引擎会自动按顺序完成累计,不需要手动写递归或逐行取值逻辑。

注意:外层SUM窗口的ORDER BY规则必须和行号生成的排序规则对齐,否则会出现累计顺序错乱、结果不符合预期的问题。这种基于集合的窗口函数写法性能远高于递归迭代写法,数据量较大时优势明显。

执行结果

运行上述代码返回的结果和你给出的预期完全一致:

_date_timern
2022-06-2209:00:001
2022-06-2209:30:003
2022-06-2210:00:006
2022-06-2210:30:0010
2022-06-2211:00:0015
2022-06-2309:00:0016
2022-06-2309:30:0018
2022-06-2310:00:0021

内容的提问来源于stack exchange,提问作者Cheese

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:15:41