如何在MySQL中获取分组计数变量的最大值

时间:2019-07-09 23:52:01

标签: 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

但是,这只会带来未通过网络电话细分的总计。我没有看到此问题的示例,但我确定有一个,我只是在问错。

3 个答案:

答案 0 :(得分:1)

您的示例和期望输出太基本了,您应该尝试扩大范围,以便包括更多案例。

现在,您可以使用以下命令获得期望的输出:

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

我的猜测是您可以在小组中进行不同的活动,因此您需要多个步骤

  • COUNT()计算GROUP BY netcall, activity,我称之为q
  • 然后看看我称之为MAX(total)的每个netcall的{​​{1}}
  • 现在您可以重复使用p,因为q拥有全部计数,因此只需选择一个具有最大计数的计数即可。

SQL DEMO

o

在MySQL v8 +中,您可以使用cte和window函数来简化一点

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`

答案 1 :(得分:0)

每天都在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

答案 2 :(得分:0)

    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

....