根据select

时间:2019-08-06 16:28:29

标签: sql subquery aggregate-functions

我正在尝试根据最大访问次数显示1行。我的select子句中已经有一个count函数。

这是我已经拥有的代码:

select
pat.pat_id "pat id"
,DEP.DEPARTMENT_NAME "DEPT NAME"
,COUNT (DEP.DEPARTMENT_NAME) "VISITS BY DEPT"
FROM PAT_ENC PAT
JOIN CLARITY_DEP DEP  ON PAT.DEPARTMENT_ID    = DEP.DEPARTMENT_ID
GROUP BY PAT.PAT_ID
    ,DEP.DEPARTMENT_NAME

根据上面的代码,这是我当前的结果:

PAT ID  DEPT NAME           VISITS BY DEPT
Z116547 OPS PEDI REHAB OT   177
Z116547 SSH REHAB PT        85
Z116547 SSH REHAB SLP       62
Z130422 LIB WOUND CENTER    119
Z130422 WEY UROLOGY         1
Z130422 SSH AMBULATORY CARE 1

我正在尝试编写仅显示每个Pat ID拥有最大访问次数的行的代码。

我想要得到的结果是

PAT ID  DEPT NAME           VISITS BY DEPT
Z116547 OPS PEDI REHAB OT   177
Z130422 LIB WOUND CENTER    119

我知道我需要一个子查询,只是不确定它的外观和外观。谢谢。

2 个答案:

答案 0 :(得分:0)

一种方法使用窗口函数:

SELECT pd.*
FROM (SELECT pat.pat_id, DEP.DEPARTMENT_NAME, 
             COUNT(*) as cnt,
             ROW_NUMBER() OVER (PARTITION BY DEP.DEPARTMENT_NAME ORDER BY COUNT(*) DESC) as seqnum
      FROM PAT_ENC PAT JOIN
           CLARITY_DEP DEP
           ON PAT.DEPARTMENT_ID = DEP.DEPARTMENT_ID
      GROUP BY PAT.PAT_ID, DEP.DEPARTMENT_NAME
     ) pd
WHERE seqnum = 1;

请注意,我删除了您的列别名。不得不摆弄转义的列名只会使编写查询变得更加复杂。

答案 1 :(得分:0)

使用row-number()

  select * from (select
pat.pat_id "pat id"
,DEP.DEPARTMENT_NAME "DEPT NAME"
,COUNT (DEP.DEPARTMENT_NAME) "VISITS BY DEPT",
 row_number() over(partition by pat.pat_id order by COUNT (DEP.DEPARTMENT_NAME) desc ) as rn
FROM PAT_ENC PAT
JOIN CLARITY_DEP DEP  ON PAT.DEPARTMENT_ID    = DEP.DEPARTMENT_ID
GROUP BY PAT.PAT_ID
    ,DEP.DEPARTMENT_NAME
) a where a.rn=1
相关问题