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

Posted

技术标签:

【中文标题】使用指定的顺序按字段选择连续组【英文标题】:Select continuous groups by field, using the specified order 【发布时间】:2017-09-09 20:46:48 【问题描述】:

我需要帮助解决以下需要使用窗口函数的任务。但我不知道如何从子查询示例中获取 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 上分配连续组

    行组的指定顺序(有4个)

    统计每组的记录数

    计算组中的最小记录ID

结果应该是:

其中一列是 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

【问题讨论】:

编辑您的问题并显示应该产生的结果。 "考虑到指定的记录顺序(有4个)"?显然有超过 4 条记录,并且 考虑到 没有定义任何东西。请以有意义的方式描述您的目标。而且您也没有为示例显示所需的 result 那么你有答案了吗? 【参考方案1】:

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

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

通常,连续列中的间隙是可以预料的。

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

Select longest continuous sequence Grouping or Window Serial numbers per group of rows for compound key

【讨论】:

以上是关于使用指定的顺序按字段选择连续组的主要内容,如果未能解决你的问题,请参考以下文章

想问下,sql 按 in 后的顺序排序问题。

如何在所有行中按顺序更新组号

MySQL按顺序查找每组最近/最大的记录

表的完整语法增,删,改,查( 子查询 )

Android - 连续音频播放?

使用LINQ按字母顺序比较字符串