获取PostgreSQL中名称的最大连续计数

vvppvyoh  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(2)|浏览(96)

我在一次面试中被问到这个问题:

有一个表格,其中列中提到了车辆名称。当我们检查name=car时,我们必须得到4,即列中连续出现'car'的最大计数。
有人能帮我在PostgreSQL中找到这个解决方案吗?
我试着使用等级和密集等级,但它没有工作。

30byixjq

30byixjq1#

这是一个间隙和孤岛问题,你可以尝试两个行号之间的差异来解决它。
只有当有一个列可以订购时,才可以这样做(例如:递增的ID或时间戳),如@Mureinik和@S-Man所述:

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

要获得所有名称的最大连续出现次数,只需删除where子句
Demo here

nuypyhwy

nuypyhwy2#

**免责声明:**正如@Mureinik在评论中所述:只有在有用于排序的专用列(例如递增的ID或时间戳)。原因是,在数据库中,列顺序是不确定的。因此,如果您要处理特定的订单,则始终需要一个排序顺序标准。在下面的示例中,我添加了id列。

step-by-step demo: db<>fiddle

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

1.例如,第一部分类似于我已经描述的here。您可以在子查询中找到它。它是关于window function分区,同时保持原始排序顺序。它为每个特定的name组创建唯一的组ID。
1.利用COUNT()窗口函数统计各组记录。
1.然后先点最大的数。
1.只返回第一条记录(包含最高计数数)

相关问题