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 = ?
我有一个查询,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 = ?