【问题标题】:SQL Query to find MAX values based upon count and some filtersSQL Query 根据计数和一些过滤器查找 MAX 值
【发布时间】:2018-04-12 19:20:58
【问题描述】:

表格如下:

/* Create a table called test */
CREATE TABLE test(Id integer PRIMARY KEY,Col_Key text, Ng text, node text);

/* Create few records in this table */
INSERT INTO test VALUES(1,'key1','g1','n2');
INSERT INTO test VALUES(2,'key1','g2','n3');
INSERT INTO test VALUES(3,'key2','g3','n1');
INSERT INTO test VALUES(4,'key2','g4','n1');
INSERT INTO test VALUES(5,'key3','g5','n1');
INSERT INTO test VALUES(6,'key3','g6','n2');
INSERT INTO test VALUES(7,'key4','g7','n1');
INSERT INTO test VALUES(8,'key4','g8','n1');
INSERT INTO test VALUES(9,'key5','g8','n4');
INSERT INTO test VALUES(10,'key5','g9','n4');
INSERT INTO test VALUES(11,'key6','g10','n4');
INSERT INTO test VALUES(12,'key6','g11','n4');
INSERT INTO test VALUES(13,'key7','g11','n4');
INSERT INTO test VALUES(14,'key9','q11','n3');
INSERT INTO test VALUES(15,'key9','q11','n2');
INSERT INTO test VALUES(16,'key10','q12','n1');
COMMIT;

我正在尝试从具有最大计数且其 Ng 值以 g 开头的节点列中获取值。

我做过这样的事情:

SELECT TEMP.node,COUNT(TEMP.node) FROM (SELECT Col_Key,Ng,node 
from test WHERE (Ng LIKE 'g%')) TEMP GROUP BY TEMP.node;

结果如下:

但是,在结果中我只想要 n4 和 n1 (只有节点列不计数),因为它们具有最大计数。我无法在我的查询中添加这部分。请帮忙。

以上数据只是一小部分数据,但我的 SQL 表中会有数千行,所以我的查询应该是高效的。

PS :- 我试着在下面做:

SELECT TEMP2.node,TEMP2.CNT FROM (SELECT TEMP.node,COUNT(TEMP.node) AS CNT FROM (SELECT Col_Key,Ng,node 
from test WHERE (Ng LIKE 'g%')) TEMP GROUP BY TEMP.node) TEMP2 WHERE TEMP2.CNT = (SELECT MAX(TEMP2.CNT) FROM TEMP2);

但是带有 where 子句的查询的最后一部分是错误的,因为它无法找到表 TEMP2。

但是这个 WHERE 可以明确我想要什么。

结果应该是:

node 
n1
n4

【问题讨论】:

标签: mysql sql group-by count


【解决方案1】:

怎么样:

SELECT
  t.node,
  COUNT(*)
FROM
  test t
WHERE
  t.Ng like 'g%'
GROUP BY
  t.node
HAVING
  COUNT(*) = (
    SELECT 
      MAX(a.count_of_nodes)
    FROM
    (
      SELECT
        node,
        COUNT(*) AS count_of_nodes
      FROM
        test
      WHERE
        Ng like 'g%'
      GROUP BY
        node
    ) a
  )
;

祝你好运!

【讨论】:

  • 为什么 row_num = 5?
  • 对于拥有大量数据的表,有人可以建议哪种方法是最有效的方法吗?
  • 多少数据?您需要这些结果的背景是什么?
  • 数千到数百万行
  • 很好,上下文是什么?每晚报告?即时 BI 查询?应用服务器(希望不是)?
【解决方案2】:

您的查询不需要子查询:

select node, count(*) 
from test
where Ng LIKE 'g%'
group by node;

获得一个最大值很容易(使用limit),但你想要所有这些。一种方法使用子查询和having 子句:

select node, count(*) 
from test
where Ng LIKE 'g%'
group by node
having count(*) = (select count(*)
                   from test t2
                   where t2.Ng LIKE 'g%'
                   group by t2.node
                   order by count(*) desc
                   limit 1
                  );

这比它需要的更复杂,因为 MySQL(8.0 之前)既不支持窗口函数也不支持 CTE。令人高兴的是,MySQL 8+ 中的语法更简单。

【讨论】:

    【解决方案3】:

    您可以使用 temptable 来轻松处理这种情况,如下所示:

    CREATE TEMPORARY TABLE temptable AS (
      SELECT TEMP.node,COUNT(TEMP.node) as cnt FROM (SELECT Col_Key,Ng,node 
      from test WHERE (Ng LIKE 'g%')) TEMP GROUP BY TEMP.node
    )
    select node, cnt
    from temptable t
    where cnt = (select max(cnt) from temptable)
    

    见:http://www.sqlfiddle.com/#!9/e749de/1/0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多