Select 仅那些对提供的地区访问次数最多的用户

Select only those users who have the most visits to provided district

我有一个查询,selects 用户及其访问过的地区和访问次数。

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

我只需要 select 那些最常访问所提供地区的用户。比如我有一个id为1的用户,他去过A区1次,B区3次。如果我提供 B 区作为参数,用户 1 将在 select。如果我要select个A区的用户,用户1不会在select.

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

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 = ?

请注意,您实际上不需要 table 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 = ?