Oracle SQL为每个“行”选择最大值

时间:2017-03-12 21:22:09

标签: sql oracle greatest-n-per-group

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

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

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

如果有人能指出我正确的方向,我会非常感激。

2 个答案:

答案 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.useridu.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