【问题标题】:Oracle SQL select max "for each" rowOracle SQL 选择 max "for each" 行
【发布时间】:2017-03-12 21:22:09
【问题描述】:

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

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

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 子句只包含用户 ID,因为我想包含区域。但我不希望将区域列考虑到决策中。我考虑过将它包装在另一个查询中,然后取最大值,但我没有用这种方法取得任何成功。我也考虑过使用 distinct 关键字,但这也不能解决这个问题。

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

【问题讨论】:

  • 如果有两个区域并列同一个 id 的最高计数怎么办?您需要返回所有这些行,还是只返回其中之一 - 如果“只有一个”,是哪一个?例如,假设对于一个新的 id,比如id=4,最高计数是 4,这个计数 4 与 EastNorth 相同。 id=4 的输出应该显示什么?

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


【解决方案1】:

您可以使用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 才能获得。

【讨论】:

    【解决方案2】:

    试试这个,你的查询在fromclausole:

    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
    

    【讨论】:

    • 我实际上试过这个,但不幸的是它根本没有改变输出。我认为这是因为 (id,region) 组之间没有重复的条目。就像如果有多个条目具有相同的 id/region,那么我认为它会过滤掉这些条目。但我认为它不会在这里起到作用。
    猜你喜欢
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    • 2016-11-11
    • 2011-12-10
    相关资源
    最近更新 更多