使用指定的顺序按字段选择连续组

时间:2017-09-09 20:46:49

标签: sql postgresql window-functions gaps-and-islands

我需要帮助解决以下任务,我需要使用窗口函数。但是我无法弄清楚如何从子查询样本中获取id来排序和应用聚合函数:

给出表:

create temp table users(id bigserial, group_id bigint);
insert into users(group_id)
values (1), (1), (1), (2), (1), (3);

在此表中,按ID排序,您需要: 考虑到

,在group_id上分配连续组
  1. 指定行组的顺序(其中有4个)

  2. 计算每组中的记录数

  3. 计算组中的最小记录ID

  4. 结果应为:

    其中一列是group_id,另一列是记录数,或最小id值,具体取决于任务。行应按id排序。

    输出如下:

     group_id | count
    ----------+-------
            1 |     3
            2 |     1
            1 |     1
            3 |     1
    

    第二项任务的部分解决方案,无需订购:

    SELECT COUNT(*), group_id
    FROM ( SELECT id, id - ROW_NUMBER() OVER (PARTITION BY group_id ORDER 
    BY id) AS res, group_id FROM users)new_table
    GROUP BY group_id,res;
    

    返回:

     group_id | count 
    ----------+-------
            1 |     3
            3 |     1
            1 |     1
            2 |     1
    

1 个答案:

答案 0 :(得分:0)

我猜这就是你要找的东西:

SELECT group_id
     , count(*) AS row_count  -- 2. count the number of records in each group
     , min(id)  AS min_id     -- 3. calculate the minimum record ID in the group
FROM  (
   SELECT id
        , group_id
        , id - row_number() OVER (PARTITION BY group_id ORDER BY id) AS res
   FROM   users
   ) sub
GROUP  BY group_id, res
ORDER  BY min_id;  -- 1. specified order of rows group

当然,如果序列列id中可能存在空白,则必须使用:

  row_number() OVER (ORDER BY id)
- row_number() OVER (PARTITION BY group_id ORDER BY id) AS res

通常,必须预期串行列中的间隙。

相关答案以及更多解释和链接: