Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 查找每个人员\u id对应的角色\u id的最大计数_Mysql_Sql_Database_Oracle - Fatal编程技术网

Mysql 查找每个人员\u id对应的角色\u id的最大计数

Mysql 查找每个人员\u id对应的角色\u id的最大计数,mysql,sql,database,oracle,Mysql,Sql,Database,Oracle,我正在尝试使用SQL提取以下信息。 表的架构如下所示: 人员id、角色id、计数 例如表: p1, r1, 5 p1, r2, 3 p2, r1, 8 p1, r3, 7 p2, r2, 3 p3, r1, 10 p3, r2, 15 我想编写一个查询,为每个人提取最大计数的角色id。如何在MYSql或oracle DB中实现这一点 对于上表,输出应如下所示 p1, r3, 7 p2, r2, 8 p3, r2, 15 对上述输出的解释: p1 has the maximum count a

我正在尝试使用SQL提取以下信息。 表的架构如下所示:

人员id、角色id、计数

例如表:

p1, r1, 5
p1, r2, 3
p2, r1, 8
p1, r3, 7
p2, r2, 3
p3, r1, 10
p3, r2, 15
我想编写一个查询,为每个人提取最大计数的角色id。如何在MYSql或oracle DB中实现这一点

对于上表,输出应如下所示

p1, r3, 7
p2, r2, 8
p3, r2, 15
对上述输出的解释:

p1 has the maximum count as r3 i.e. 7  
p2 has maximum count as r2 i.e. 8  
p3 has maximum count as r2 i.e.15  

我无法找出提取此数据的SQL。有人能帮我吗

一种方法是聚合和连接:

select t.person_id, t.role_id, t.count
from t join
     (select person_id, max(count) as count
      from t
      group by person_id
     ) tsum
     on tsum.person_id = t.person_id and
        tsum.count = t.count;
但是,如果存在具有相同最大计数的重复项,则会出现问题

如果需要任意角色,当存在重复角色时,可以聚合此查询的结果:

select t.person_id, max(t.role_id), t.count
from (select t.person_id, t.role_id, t.count
      from t join
           (select person_id, max(count) as count
            from t
            group by person_id
           ) tsum
           on tsum.person_id = t.person_id and
              tsum.count = t.count
     ) t
group by t.person_id, t.count

也有其他方法,但这在两个数据库中都有效。

忽略列名为count(最好使用在任何SQL风格中都不可能是保留字的内容):-


“从表d1中选择d1.nam、d1.rol、max(d1.cnt)作为d1-group by d1.nam;”这很简单:)它也不会持续工作;)。d1.rol的值将来自其中一行,但不一定是与最高的d1.cnt对应的行。您确定吗?查询应该为相同的人员id选择具有最大计数的元组。分组依据不应该这样工作吗。我检查了结果,结果确实相符。我是不是遗漏了什么。我使用的查询如下:“通过d1.people_id从表d1 group中选择d1.people_id、d1.role、max(d1.count)”;我不明白为什么这不起作用?非常确定。您的查询将获得每个名称以及每个名称的最大cnt。但rol列不是聚合列,也不是分组列。为每个名称返回的值将为该名称返回一个值,但未定义哪个值。通常,它是在处理时发现的第一个,但这并不确定,并且在将来或存储引擎之间也可能会发生变化。例如,对于人员p1的测试数据,它将返回计数7(因为这是最大值),但返回的角色可能是r1、r2或r3。明白了。谢谢你的解释。这个简单的查询也可以。我刚试过。谢谢你的回复。下面的查询:从表d1中选择d1.name、d1.role、max(d1.cnt),按d1.name作为d1组;下面的查询工作是否会根据d1.people_id从表d1 group中选择d1.people_id、d1.role、max(d1.count);在您的第二个查询中,如果列是role_name(varchar)而不是role_id(integer),如何断开连接?@user2519648。同样的想法
min()
max()
处理字符字段、数字字段和日期。
SELECT a.person_id, a.role_id, a.count
FROM table a
INNER JOIN 
(
    SELECT person_id, MAX(count) AS MaxCount
    FROM table
    GROUP BY person_id
) Sub1
ON a.person_id = Sub1.person_id AND a.count = Sub1.MaxCount