sql聚合数据

时间:2016-05-08 06:48:48

标签: sql greatest-n-per-group

这不是一个特定的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的最大计数

2 个答案:

答案 0 :(得分:1)

这可以使用窗口函数轻松解决。

以下是标准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()

SQLFiddle:http://sqlfiddle.com/#!15/f02a9/1

答案 1 :(得分:0)

试试这个

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