3

任何人都可以帮助我使用 SQL 来返回 App_ID 的最高计数。我正在运行这个返回以下数据集的 SQL。

SELECT COMP_ID, APP_ID, count(*) as cnt 
FROM APP_ACCT_VIEW
GROUP BY COMP_ID, APP_ID

COMP_ID APP_ID                    CNT
cpo1000c    AT                    999
cpo1kact    AT                    895
cpo1kact    CPOPYMTS_Administrative    1020
cpo1000c    CPOPYMTS_HighValue           1900
cpo1kact    CPOPYMTS_HighValue           1020
cpo1000c    CPOPYMTS_Internal            1999
cpo1kact    CPOPYMTS_Internal            1020
cpo1kact    IRCDR                     1020
cpo1000c    IRCDR                     50

但我需要 SQL 返回每个 APP_ID 的顶部/最高 cnt,并且需要输出看起来像这样。

COMP_ID APP_ID                    CNT
cpo1000c    AT                    999
cpo1kact    CPOPYMTS_Administrative    1020
cpo1000c    CPOPYMTS_HighValue           1900
cpo1000c    CPOPYMTS_Internal            1999
cpo1kact    IRCDR                     1020

谢谢迪彭

4

3 回答 3

4

在大多数数据库中,您可以使用该row_number()函数来执行此操作:

select comp_id, app_id, cnt
from (select t.*, row_number() over (partition by app_id order by cnt desc) as seqnum
      from (SELECT COMP_ID, APP_ID, count(*) as cnt
            FROM APP_ACCT_VIEW
            GROUP BY COMP_ID, APP_ID
           ) t
     ) t
where seqnum = 1

如果这不可用,则必须以其他方式计算 seqnum,例如相关子查询。

于 2013-02-11T21:50:34.667 回答
4

如果您使用的是 SQL-Server 2005 或更高版本,则可以将 CTE 与ROW_NumberorDENSE_RANK函数一起使用:

WITH CTE AS
(
   SELECT COMP_ID, APP_ID, 
       CNT = COUNT(*) OVER (PARTITION BY APP_ID, COMP_ID) ,
       RN  = ROW_NUMBER() OVER (PARTITION BY APP_ID ORDER BY CNT DESC) 
    FROM APP_ACCT_VIEW
)
SELECT COMP_ID, APP_ID, CNT
FROM CTE
WHERE RN = 1

如果您改为使用,则如果它们具有相同(最高) ,则DENSE_RANK每个记录将获得多条记录,这与每组总是返回一个结果不同。APP_IDCNTROW_NUMBER

于 2013-02-11T21:52:26.807 回答
0

另一种选择

 ;WITH cte AS
 (
  SELECT COMP_ID, APP_ID, COUNT(*) AS cnt,
         ROW_NUMBER() OVER(PARTITION BY APP_ID ORDER BY COUNT(*) DESC) AS rn
  FROM dbo.APP_ACCT_VIEW
  GROUP BY COMP_ID, APP_ID
  )
  SELECT COMP_ID, APP_ID, cnt
  FROM cte
  WHERE rn = 1

SQLFiddle上的演示

于 2013-02-11T23:28:21.163 回答