首页 > 解决方案 > 按组内每 N 行分组

问题描述

我需要对每组 SQL 表中的每 N 行进行分组,我找到的最佳答案是这个;https://stackoverflow.com/a/66806186/10916933但我的数据也按另一个标识符(批处理)分组,我想在每次标识符更改时启动一个新的 GroupID。批次大小不一致。

这是我目前得到的(出于显示目的,N = 2,实际上是 1000):

价值 行号 组ID
一个 10.2 1 1
一个 6.7 2 1
一个 7.6 3 2
7.0 4 2
10.2 5 3
C 9.6 6 3
C 8.2 7 4
C 1.1 8 4
C 0.3 9 5
C 9.0 10 5
C 10.2 11 6

这就是我想要的(即当 Batch B 开始时,它给了我一个新的 GroupID,即使只有一个):

价值 行号 组ID
一个 10.2 1 1
一个 6.7 2 1
一个 7.6 3 2
7.0 4 3
10.2 5 3
C 9.6 6 4
C 8.2 7 4
C 1.1 8 5
C 0.3 9 5
C 9.0 10 6
C 10.2 11 6

标签: sqlsql-server

解决方案


嗯。. . 您可以指示组开始使用的位置lag()和行号算术。然后做一个累积和。一个新组从每批的奇数行开始:

select t.*,
       sum(is_start) over (order by batch, rowid) as groupid
from (select t.*,
             (case when row_number() over (partition by batch order by rowid) % 2 = 1
                   then 1 else 0
              end) as is_start
      from t
     ) t

推荐阅读