sql 聚合数据
sql aggregate data
这不是特定的 dbms 问题,而是一般的 sql 问题。
我有这个数据集
userid | objecteid| count
--------------------------
1 | 1 | 12
1 | 2 | 15
1 | 3 | 6
2 | 4 | 30
2 | 1 | 1
2 | 5 | 9
通过一个查询,我需要找到:对于每个用户,具有最大计数的对象
寻找这样的结果:
userid | objecteid| count
--------------------------
1 | 2 | 15
2 | 4 | 30
因为对象 2 对用户 1 的计数最大,而对象 4 对用户 2 的计数最大
这可以使用 window 函数轻松解决。
以下为标准 ANSI SQL:
select userid, objecteid, "count"
from (
select userid, objecteid, "count",
max("count") over (partition by userid) as max_cnt
from the_table
) t
where "count" = max_cnt;
如果有两个对象具有相同的count
,都将被返回。
或者,这也可以使用 row_number()
代替:
select userid, objecteid, "count"
from (
select userid, objecteid, "count",
row_number() over (partition by userid order by "count" desc) as rn
from the_table
) t
where rn = 1;
与第一个查询不同,如果用户有多个具有相同计数的对象,这将只选择 一个 行。如果您希望返回这些重复项,请使用 dense_rank()
而不是 row_number()
试试这个
Select * from tableName
where count in (
Select Max(count)
from tableName
group by userid
)
这不是特定的 dbms 问题,而是一般的 sql 问题。
我有这个数据集
userid | objecteid| count
--------------------------
1 | 1 | 12
1 | 2 | 15
1 | 3 | 6
2 | 4 | 30
2 | 1 | 1
2 | 5 | 9
通过一个查询,我需要找到:对于每个用户,具有最大计数的对象
寻找这样的结果:
userid | objecteid| count
--------------------------
1 | 2 | 15
2 | 4 | 30
因为对象 2 对用户 1 的计数最大,而对象 4 对用户 2 的计数最大
这可以使用 window 函数轻松解决。
以下为标准 ANSI SQL:
select userid, objecteid, "count"
from (
select userid, objecteid, "count",
max("count") over (partition by userid) as max_cnt
from the_table
) t
where "count" = max_cnt;
如果有两个对象具有相同的count
,都将被返回。
或者,这也可以使用 row_number()
代替:
select userid, objecteid, "count"
from (
select userid, objecteid, "count",
row_number() over (partition by userid order by "count" desc) as rn
from the_table
) t
where rn = 1;
与第一个查询不同,如果用户有多个具有相同计数的对象,这将只选择 一个 行。如果您希望返回这些重复项,请使用 dense_rank()
而不是 row_number()
试试这个
Select * from tableName
where count in (
Select Max(count)
from tableName
group by userid
)