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
相关产品推荐
相关产品推荐

