我需要帮助解决以下任务,我需要使用窗口函数。但是我无法弄清楚如何从子查询样本中获取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
答案 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
通常,必须预期串行列中的间隙。
相关答案以及更多解释和链接: