我正在处理 SQL Server 2016 的查询。我按 serial_no 排序并按 pay_type 分组,我想添加行号,下面的示例相同
row_no | pay_type | serial_no
1 | A | 4000118445
2 | A | 4000118458
3 | A | 4000118461
4 | A | 4000118473
5 | A | 4000118486
1 | B | 4000118499
2 | B | 4000118506
3 | B | 4000118519
4 | B | 4000118521
1 | A | 4000118534
2 | A | 4000118547
3 | A | 4000118550
1 | B | 4000118562
2 | B | 4000118565
3 | B | 4000118570
4 | B | 4000118572
请帮助我..
SELECT
ROW_NUMBER() OVER(PARTITION BY paytype ORDER BY serial_no) as row_no,
paytype, serial_no
FROM table
ORDER BY serial_no
您可以将组分配给相同的相邻付款类型,然后使用
row_number()
。为此,行号的差异是确定组的好方法:
select row_number() over (partition by pay_type, seqnum - seqnum_2 order by serial_no) as row_no,
t.*
from (select t.*,
row_number() over (order by serial_no) as seqnum,
row_number() over (partition by pay_type order by serial_no) as seqnum_2
from t
) t;
此类问题是间隙和岛屿问题的一个例子。为什么行号的差异会起作用?我发现最简单的理解方法就是看子查询的结果。
这里是一个db<>小提琴。
将此添加到您的选择列表中
ROW_NUMBER() OVER ( ORDER BY (SELECT 1) )
因为你已经按你的东西排序了,所以你不需要在你的窗口函数中排序,所以消耗更少的CPU,
此查询将生成一个结果集,其中每个 pay_type 分组都有自己的行号集,根据serial_no 的顺序递增。对于每个新的 pay_type,行号将重新开始。
选择 ROW_NUMBER() OVER (PARTITION BY pay_type ORDER BY serial_no) AS row_no, 支付类型, 序列号 从 你的表名;