Oracle SQL select 最大 "for each" 行

Oracle SQL select max "for each" row

我正在尝试找到一种方法来 select table 中每个用户具有最高值的行。除非我误解了,否则我不能简单地按每一行分组

例如,假设我目前有这样的查询:

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 关键字,但这也不能解决这个问题。

如果有人能指出正确的方向,我将不胜感激。

您可以使用 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.useridu.userid 相同。当然,如果您需要 usersTable 中的其他信息,则需要 join 才能获取。

试试这个,你的查询在 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