with cte as (
SELECT
*, row_number() over(order by id) - row_number() over (partition by name order by id) as grp
FROM mytable
)
select name, count(1)
from cte
where name = 'car'
group by name, grp
order by count(1) desc
limit 1
SELECT
name,
COUNT(*) OVER (PARTITION BY group_id) -- 2
FROM (
SELECT -- 1
*,
SUM(eq) OVER (ORDER BY id) as group_id
FROM (
SELECT
*,
(name != lag(name) OVER (ORDER BY id))::int as eq
FROM mytable
) s
) s
ORDER BY count DESC -- 3
LIMIT 1 -- 4
2条答案
按热度按时间30byixjq1#
这是一个间隙和孤岛问题,你可以尝试两个行号之间的差异来解决它。
只有当有一个列可以订购时,才可以这样做(例如:递增的ID或时间戳),如@Mureinik和@S-Man所述:
要获得所有名称的最大连续出现次数,只需删除
where
子句Demo here
nuypyhwy2#
**免责声明:**正如@Mureinik在评论中所述:只有在有用于排序的专用列(例如递增的ID或时间戳)。原因是,在数据库中,列顺序是不确定的。因此,如果您要处理特定的订单,则始终需要一个排序顺序标准。在下面的示例中,我添加了
id
列。step-by-step demo: db<>fiddle
1.例如,第一部分类似于我已经描述的here。您可以在子查询中找到它。它是关于window function分区,同时保持原始排序顺序。它为每个特定的
name
组创建唯一的组ID。1.利用
COUNT()
窗口函数统计各组记录。1.然后先点最大的数。
1.只返回第一条记录(包含最高计数数)