sql – 从Group获取最大计数

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

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

Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 PID                                                VARCHAR2(20)
 CID                                                VARCHAR2(20)

以下是可用的行

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

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

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

预期结果:

pid   cid    count(cid)
---   ---    -----------
p1    c2         3
p2    c1         6

解决方法

假设一个支持窗口函数和CTE的数据库系统(你没有指定一个,但我怀疑是Oracle?),我会写:
;With Groups as (
    select pid,cid,COUNT(*) as cnt from checks group by pid,cid
),Ordered as (
    select pid,cnt,ROW_NUMBER() OVER (PARTITION BY pid ORDER BY cnt desc) as rn,COUNT(*) OVER (PARTITION BY pid) as multi
    from Groups
)
select pid,cnt
from Ordered
where rn = 1 and multi > 1

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

最后,我们选择那些被分配了行号1(最高计数)的行,并为此我们获得了同一个pid的多个结果.

这是一个Oracle fiddle玩.这是一个SQL Server version(感谢Andriy M生产Oracle的一个)

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...