每组最大元素的分组结果

时间:2015-10-14 14:02:01

标签: sql-server sql-server-2005

我需要将记录划分为每组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

我的数据表如下所示:

 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组中。

可能有功能可以做到这一点,但由于我的英语技能,我无法找到它。

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

2 个答案:

答案 0 :(得分:2)

您可以使用ROW_NUMBER

执行此操作
SELECT  id,
        group_id = (ROW_NUMBER() OVER (ORDER BY id) - 1) / 4 + 1
FROM    my_table

即使您的id存在空白,也会有效,例如1,2,5,10。

答案 1 :(得分:1)

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

SQL小提琴似乎被打破了,所以我无法编辑你的例子。