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()

SQL小提琴:http://sqlfiddle.com/#!15/f02a9/1

试试这个

Select * from tableName 
         where count in (
            Select Max(count) 
            from tableName 
            group by userid 
         )