使用指定的顺序按字段选择连续组
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【讨论】:
以上是关于使用指定的顺序按字段选择连续组的主要内容,如果未能解决你的问题,请参考以下文章