每组最大元素的组结果

Group results with max elements per group

我需要将记录分成每个组 ID 最多有 n 个元素的组,我需要额外的列作为某种计数器,当它达到一定的行数时会递增 1。 我的母语不是英语,所以我构建了示例代码来显示我拥有的数据和我需要的结果。

这是 sqlfiddle:http://sqlfiddle.com/#!3/c9cf5/1

这是 sqlfiddle 代码:

CREATE TABLE tab1 
    (
     id int
    );

INSERT INTO tab1 (id) VALUES (1)
INSERT INTO tab1 (id) VALUES (2)
INSERT INTO tab1 (id) VALUES (3)
INSERT INTO tab1 (id) VALUES (4)
INSERT INTO tab1 (id) VALUES (5)
INSERT INTO tab1 (id) VALUES (6)
INSERT INTO tab1 (id) VALUES (7)
INSERT INTO tab1 (id) VALUES (8)
INSERT INTO tab1 (id) VALUES (9)
INSERT INTO tab1 (id) VALUES (10)
INSERT INTO tab1 (id) VALUES (11)
INSERT INTO tab1 (id) VALUES (12)
INSERT INTO tab1 (id) VALUES (13)
INSERT INTO tab1 (id) VALUES (14)
INSERT INTO tab1 (id) VALUES (15)
INSERT INTO tab1 (id) VALUES (16)
INSERT INTO tab1 (id) VALUES (17)
INSERT INTO tab1 (id) VALUES (18)
INSERT INTO tab1 (id) VALUES (18)
INSERT INTO tab1 (id) VALUES (20)

SELECT id,
NTILE(4) OVER(ORDER BY id DESC) AS X
from tab1

我的 table 数据如下所示:

 id
 --
 1
 2
 3
 4
 5
 6
 7
 8
 9
10

我需要这样的结果:

 id | group
 --
 1 | 1
 2 | 1
 3 | 1
 4 | 1
 5 | 2
 6 | 2
 7 | 2
 8 | 2
 9 | 3
10 | 3

在上面的示例中,我想将所有记录分组到最多包含 4 个元素的组中,因此记录 1-4 在第 1 组中,记录 5-8 在第 2 组中,记录 9-10 在第 3 个中。

可能有内置函数可以执行此操作,但由于我的英语水平,我找不到它。

我已经尝试计算 table 中的所有元素并将其除以数字或元素,然后在 NTILE 中使用它,但这样我得到了相等的组,这不是我需要的结果。

只需使用row_number() over (order by id),您可以将行号除以例如4,然后您将得到每4行增加的数字。

SQL Fiddle 好像有问题,所以我不能编辑你的例子。

您可以使用 ROW_NUMBER:

SELECT  id,
        group_id = (ROW_NUMBER() OVER (ORDER BY id) - 1) / 4 + 1
FROM    my_table

即使您的 id 中存在空白,如 1,2,5,10。