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

SQL Server中如何按分组获取上一行数据?(LAG函数未达预期)

搞定分组取上一行自定义值的问题

嘿,我明白你遇到的问题了——想用LAG函数按col1分组取上一行数据,但没得到预期结果对吧?先理清楚你的核心需求:按col1分组,每个组内按col2升序排列,给每行生成A/B/C这类自定义字母序列,再把组内上一行的这个字母存入col4,组内第一行的col4则为NULL。

两步走解决问题

我们得先给每个分组生成专属的字母序列,再用LAG函数精准获取分组内的上一行值。

第一步:生成分组内的字母序列

先用ROW_NUMBER()窗口函数给每个col1分组里的行按col2排个递增序号,再利用ASCII码的规律把序号转成对应字母(比如1→A,2→B):

SELECT 
    col1,
    col2,
    col3,
    -- 65是字母A的ASCII码,序号+64刚好对应A/B/C...的序列
    CHAR(64 + ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY col2)) AS seq_col
FROM your_table;

这一步会给每个分组的行生成专属字母,比如ABCD组的1/2/3行就对应A/B/C。

第二步:用LAG取分组内上一行的字母

把上面的结果作为子查询,用LAG()函数时一定要加上PARTITION BY col1,这样才能把计算范围限制在每个分组内,而不是整个表跨分组查找:

SELECT 
    col1,
    col2,
    seq_col AS col3, -- 对应你示例里替换后的A/B/C列,看起来原col3被替换成了这个序列
    LAG(seq_col) OVER (PARTITION BY col1 ORDER BY col2) AS col4
FROM (
    SELECT 
        col1,
        col2,
        col3,
        CHAR(64 + ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY col2)) AS seq_col
    FROM your_table
) AS sub_query;

为啥你之前用LAG没成功?

十有八九是没加PARTITION BY col1!如果只写LAG(...) OVER (ORDER BY col2),LAG会在整个表范围内取上一行(会跨分组),自然不符合你的需求。加上PARTITION BY col1后,计算就被限制在每个col1分组内,结果就对了。

注:看你示例里EFGH的第6行col3是E,应该是笔误吧?如果需要自定义非顺序的字母,得额外加个映射表,但从你的需求描述来看,按分组内的行顺序生成字母序列就足够了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:48:54