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.userid
与 u.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
我正在尝试找到一种方法来 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.userid
与 u.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