SQL Server 添加每组行号

问题描述 投票:0回答:4

我正在处理 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

请帮助我..

sql sql-server-2016
4个回答
1
投票
SELECT
    ROW_NUMBER() OVER(PARTITION BY paytype ORDER BY serial_no) as row_no,
    paytype, serial_no
FROM table
ORDER BY serial_no

0
投票

您可以将组分配给相同的相邻付款类型,然后使用

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<>小提琴。


0
投票

将此添加到您的选择列表中

 ROW_NUMBER() OVER ( ORDER BY (SELECT 1) ) 

因为你已经按你的东西排序了,所以你不需要在你的窗口函数中排序,所以消耗更少的CPU,


0
投票

此查询将生成一个结果集,其中每个 pay_type 分组都有自己的行号集,根据serial_no 的顺序递增。对于每个新的 pay_type,行号将重新开始。

选择 ROW_NUMBER() OVER (PARTITION BY pay_type ORDER BY serial_no) AS row_no, 支付类型, 序列号 从 你的表名;

© www.soinside.com 2019 - 2024. All rights reserved.