从组中获取最大计数

use*_*r01 7 sql group-by max

我很难在sql中获取组函数的输出.Below是表的详细信息

我有1个表的名称"检查"有2列pid,cid

 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 PID                                                VARCHAR2(20)
 CID                                                VARCHAR2(20)
Run Code Online (Sandbox Code Playgroud)

以下是可用的行

select * from checks;

PID                  CID
-------------------- --------------------
p1                   c1
p1                   c1
p1                   c2
p1                   c2
p1                   c2
p2                   c1
p2                   c1
p2                   c1
p2                   c1
p2                   c1
p2                   c1
p2                   c2
p2                   c2
p2                   c2
p2                   c2
p2                   c2
Run Code Online (Sandbox Code Playgroud)

P代表参与者,c代表类别

我需要知道哪个参与者参与哪个类别参与者最多参与哪个类别(对于每个参与者)

预期结果:

pid   cid    count(cid)
---   ---    -----------
p1    c2         3
p2    c1         6
Run Code Online (Sandbox Code Playgroud)

Dam*_*ver 5

假设一个支持窗口函数和 CTE 的数据库系统(你没有指定一个,但我怀疑是 Oracle?),我会写:

;With Groups as (
    select pid,cid,COUNT(*) as cnt from checks group by pid,cid
), Ordered as (
    select pid,cid,cnt,
       ROW_NUMBER() OVER (PARTITION BY pid ORDER BY cnt desc) as rn,
       COUNT(*) OVER (PARTITION BY pid) as multi
    from Groups
)
select pid,cid,cnt
from Ordered
where rn = 1 and multi > 1
Run Code Online (Sandbox Code Playgroud)

第一个 CTE ( Groups) 只是找到每个唯一cid,pid组合的计数。第二个 CTE( Ordered) 根据计数为这些结果分配行号 - 最高计数分配的行号为 1。我们还计算为每个 生成的总行数pid

最后,我们选择那些被分配了行号 1(最高计数)的行,并且我们为相同的pid.

这是一个可以玩的Oracle 小提琴。这是一个SQL Server 版本(感谢 Andriy M 制作了 Oracle 版本)


Kar*_*yan -1

select pid, cid, count
from (
    select pid, cid, count(*) as count
    from checks
    group by pid, cid
    order by count DESC
) as temp
group by pid;
Run Code Online (Sandbox Code Playgroud)

MySQL 中也是如此。