我正在尝试找到一种方法来为表中的每个用户选择具有最高值的行。除非我误解,否则我不能简单地按行分组
例如,假设我目前有这样的查询:
select u.userid, p.region, count(u.userid) count
from userTable u join purchasesTable p on u.userid = p.userid
group by (u.userid, p.region)
它现在给出了这样的结果:
id Region COUNT
---------- ----------- ----------
1 East 1
2 West 1
3 North 1
1 North 2
2 East 3
3 West 4
我想过滤结果,以显示每个用户购买次数最多的地区(不是整体购买次数最多的地区或用户)。
id Region COUNT
---------- ----------- ----------
1 North 2
2 East 3
3 West 4
我不能使group by子句只包含userid,因为我想要包含该区域。但我不希望将区域列作为决定的因素。我考虑将其包装在另一个查询中,然后获取最大值,但我没有取得任何成功。我也考虑过使用distinct关键字,但这也无法解决这个问题。
如果有人能指出我正确的方向,我会非常感激。
答案 0 :(得分:0)
您可以使用row_number()
:
select userid, region, cnt
from (select p.userid, p.region, count(*) as cnt,
row_number() over (partition by p.userid order by count(*) desc) as seqnum
from purchasesTable p
group by p.userid, p.region
) ur
where seqnum = 1;
注意:我从查询中删除了join
。对于您所述的查询,没有必要,因为p.userid
与u.userid
相同。当然,如果您需要usersTable
中的其他信息,那么您需要join
才能获得该信息。
答案 1 :(得分:0)
试试这个,您的查询位于from
clausole:
select
id,region,max(count_)
from
(
select u.userid, p.region, count(u.userid) count as count_
from userTable u join purchasesTable p on u.userid = p.userid
group by (u.userid, p.region)
) exe
group by id,region