仅选择对提供的区域访问次数最多的用户
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 = ?
【讨论】:
感谢您的回复。最后一个查询解决了我的问题。以上是关于仅选择对提供的区域访问次数最多的用户的主要内容,如果未能解决你的问题,请参考以下文章
Oracle SQL:计算给定条目的属性出现的频率并选择出现次数最多的属性