3

App_ID の最大数を返す SQL を手伝ってくれる人はいますか? 次のデータセットを返すこの 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

しかし、各 APP_ID のトップ/最高の cnt を返すには SQL が必要であり、このような出力が必要です。

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

SQL-Server 2005 以降を使用している場合は、ROW_NumberorDENSE_RANK関数で CTE を使用できます。

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

代わりに使用すると、グループごとに常に 1 つの結果を返すのとは異なり、同じ (最高) の場合にDENSE_RANK複数のレコードが取得されます。APP_IDCNTROW_NUMBER

于 2013-02-11T21:52:26.807 に答える
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 に答える
0

もう1つのオプション

 ;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 に答える