SQL 服务器每组添加行号
SQL Server Add row number each group
我正在查询 SQL Server 2016。我按 serial_no 排序并按 [=21= 分组] 并且我想在下面的相同示例中添加行号
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
请帮帮我..
您可以将组分配给相同的相邻薪酬类型,然后使用 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;
此类问题是 gaps-and-islands 问题的一个示例。为什么行号的差异有效?我发现最简单的理解方式就是看子查询的结果。
Here 是一个 db<>fiddle.
SELECT
ROW_NUMBER() OVER(PARTITION BY paytype ORDER BY serial_no) as row_no,
paytype, serial_no
FROM table
ORDER BY serial_no
将此添加到您的 select 列表
ROW_NUMBER() OVER ( ORDER BY (SELECT 1) )
因为你已经按你的东西排序了,所以你不需要在你的窗口函数中排序所以消耗更少 CPU,
我正在查询 SQL Server 2016。我按 serial_no 排序并按 [=21= 分组] 并且我想在下面的相同示例中添加行号
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
请帮帮我..
您可以将组分配给相同的相邻薪酬类型,然后使用 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;
此类问题是 gaps-and-islands 问题的一个示例。为什么行号的差异有效?我发现最简单的理解方式就是看子查询的结果。
Here 是一个 db<>fiddle.
SELECT
ROW_NUMBER() OVER(PARTITION BY paytype ORDER BY serial_no) as row_no,
paytype, serial_no
FROM table
ORDER BY serial_no
将此添加到您的 select 列表
ROW_NUMBER() OVER ( ORDER BY (SELECT 1) )
因为你已经按你的东西排序了,所以你不需要在你的窗口函数中排序所以消耗更少 CPU,