仅选择对提供的区域访问次数最多的用户

Posted

技术标签:

【中文标题】仅选择对提供的区域访问次数最多的用户【英文标题】:Select only those users who have the most visits to provided district 【发布时间】:2021-02-19 00:27:51 【问题描述】:

我有一个查询,它根据他们访问过的地区和访问次数来选择用户。

select users.id, places.district, count(users.id) as counts from users
  left join visits on users.id = visits.user_id
  inner join places on visits.place_id = places.id
group by users.id, places.district

我只需要选择访问次数最多的用户。例如,我有一个 id 为 1 的用户访问了 A 区 1 次和 B 区 3 次。如果我提供 B 区作为参数,则用户 1 将处于选择状态。如果我想从A区选择用户,用户1不会在选择中。

【问题讨论】:

【参考方案1】:

我认为这是排名,然后是过滤:

select *
from (
    select u.id, p.district, count(*) as cnt_visits,
        rank() over(partition by u.id order by count(*) desc)
    from users u
    inner join visits v on u.id = v.user_id
    inner join places p on p.id = v.place_id
    group by u.id, p.district
) t
where rn = 1 and district = ?

请注意,您实际上并不需要表 users 来获得此结果。我们可以将查询简化为:

select *
from (
    select v.user_id, p.district, count(*) as cnt_visits,
        rank() over(partition by u.id order by count(*) desc)
    from visits v
    inner join places p on p.id = v.place_id
    group by v.user_id, p.district
) t
where rn = 1 and district = ?

此查询处理***关系:如果用户在两个不同地区的最大访问次数相同,则两者都被考虑在内。如果您不需要该功能,那么我们可以使用distinct on 简化子查询:

select *
from (
    select distinct on (v.user_id) v.user_id, p.district, count(*) as cnt_visits
    from visits v
    inner join places p on p.id = v.place_id
    group by v.user_id, p.district
    order by v.user_id, cnt_visits desc
) t
where district = ?

【讨论】:

感谢您的回复。最后一个查询解决了我的问题。

以上是关于仅选择对提供的区域访问次数最多的用户的主要内容,如果未能解决你的问题,请参考以下文章

选择购买次数最多的客户,按日期分组

在 R data.table 中选择每行重复次数最多的项目

Oracle SQL:计算给定条目的属性出现的频率并选择出现次数最多的属性

Spark实战--寻找5亿次访问中,访问次数最多的人

如何编写 SqlCommand 在 ASP.NET 的列中选择前 3 个重复次数最多的值

我想查阅 Twitter 提要列表,选择转发次数最多的推文,然后将其发布到 Telegram。这可能吗?