簡體   English   中英

如何在MySQL中獲取分組計數變量的最大值

[英]How to get max value of a grouped counted variable in MySQL

我有一個這樣的MySQL表;

recordID| netcall    | sign | activity | netid
1       | group1     | wa1  | 1        | 20
2       | group2     | wa2  | 2        | 30
3       | group1     | wa2  | 1        | 20
4       | group2     | wa3  | 2        | 30
5       | group1     | wa1  | 1        | 40
6       | group3     | wa4  | 3        | 50
7       | group3     | wa4  | 3        | 50
8       | group1     | wa2  | 1        | 40
9       | group1     | wa1  | 1        | 40
10      | group2     | wa4  | 2        | 60

我需要的是:

Netcall | count | activity | netid
Group1  | 3     | 1        | 40
Group2  | 2     | 2        | 30
Group3  | 2     | 3        | 50

我以為我可以;

SELECT MAX(xx.mycount) AS MAXcount
  FROM (SELECT COUNT(tt.sign) AS mycount ,tt.activity
        FROM NetLog tt
       WHERE ID <> 0
       GROUP BY netcall) xx

但這只會帶來未通過網絡電話細分的總數。 我沒有看到此問題的示例,但我確定有一個問題,我只是在問錯。

您的示例和期望輸出太基本了,您應該嘗試擴展,以便包括更多案例。

現在,您可以使用以下命令獲得期望的輸出:

SELECT `netcall`, COUNT(*) as `total`, MAX(`activity`) as `activity`
FROM t
GROUP BY `netcall`;

我的猜測是您可以在小組中進行不同的活動,因此您需要多個步驟

  • 計算GROUP BY netcall, activity通話的COUNT() GROUP BY netcall, activity我稱之為q
  • 然后查看每個我稱之為p通話的MAX(total)netcall
  • 現在,您將q作為o重用了q ,因此您只需擁有最大計數即可。

SQL演示

SELECT o.`netcall`, o.total, o.`activity`
FROM (
      SELECT `netcall`, COUNT(*) `total`, `activity`
      FROM t
      GROUP BY `netcall`, `activity`
     ) o 
JOIN (     
      SELECT `netcall`, MAX(`total`) as `total`
      FROM (
        SELECT `netcall`, COUNT(*) `total`
        FROM t
        GROUP BY `netcall`, `activity`
      ) q  
      GROUP BY `netcall`
     ) p
  ON o.`netcall` = p.`netcall`
 AND o.`total` = p.`total`

使用MySQL v8 +,您可以使用cte和window函數來簡化一點

with group_count as (
  SELECT `netcall`, COUNT(*) as total, `activity`        
  FROM t
  GROUP BY `netcall`, `activity`
), group_sort as (
  SELECT `netcall`, total, `activity`, 
          RANK() OVER (PARTITION BY `netcall`, `activity` ORDER BY total DESC) as rnk
  FROM group_count
)  
SELECT *
FROM group_sort
WHERE rnk = 1

每天都在SO上詢問(並回答)這個問題; 它甚至在MySQL手冊中都有自己的章節,但是無論如何...

SELECT a.netcall
     , b.total
     , a.activity
  FROM netlog a
  JOIN
     ( SELECT netcall 
            , MAX(record_id) record_id
            , COUNT(*) total
         FROM netlog 
        GROUP 
           BY netcall 
    ) b
   ON b.netcall = a.netcall
  AND b.record_id = a.record_id
    SELECT k.netcall, k.netID,  MAX(k.logins) highest, 
AVG(k.logins) average, netDate, activity
                          FROM
                            (SELECT netID, netcall, COUNT(*) logins, DATE(`logdate`) as netDate, activity
                               FROM NetLog
                              WHERE netID <> 0 AND status = 1
                                AND netcall <> '0' AND netcall <> ''
                              GROUP BY netcall, netID) k
                            GROUP BY netcall  
                            ORDER BY highest DESC 

結果:

Net Call    Highest Average Net ID  Sub Net Of...   ICS
214   309   Map Date    Activity
MESN    65  41.5294 339     214     309 MAP 2017-09-03  MESN
W0KCN   34  14.9597 1       214     309 MAP 2016-03-15  KCNARES Weekly 2m Voice Net
W0ERH   31  31.0000 883     214     309 MAP 2018-10-12  Johnson Co. Radio Amateurs Club Meeting Net
KCABARC 29  22.3333 57      214     309 MAP 2016-10-10  KCA Blind Amateurs Weekly 2m Voice Net

....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM