[英]Count most frequent element in a column in MySQL
我有以下问题。
我必须列,并且我希望每个唯一条目的第一列是第二列中最常见的元素。 一个例子是:
COL A COL B
1 a
2 c
2 c
1 a
1 b
2 d
查询应输出:
Col A COL B
1 a
2 c
鉴于此示例数据:
CREATE TABLE t
(`a` int, `b` varchar(1))
;
INSERT INTO t
(`a`, `b`)
VALUES
(1, 'a'),
(2, 'c'),
(2, 'c'),
(1, 'a'),
(1, 'b'),
(2, 'd')
;
您首先必须使用如下查询获取每个计数:
SELECT
a, b,
COUNT(*) AS amount
FROM
t
GROUP BY
a, b
然后你可以使用这个查询作为子查询来获取某个列包含最大值的行。 手册中有一篇很好的文章: The Rows Holding the Group-wise Maximum of a certain Column
例如,选择上述文章中描述的最后一种方法,您的最终查询将是:
SELECT sq1.a, sq1.b FROM
(
SELECT
a, b,
COUNT(*) AS amount
FROM
t
GROUP BY
a, b
) sq1
LEFT JOIN
(
SELECT
a, b,
COUNT(*) AS amount
FROM
t
GROUP BY
a, b
) sq2 ON sq1.a = sq2.a AND sq1.amount < sq2.amount
WHERE sq2.amount IS NULL;
有了这个结果:
+------+------+
| a | b |
+------+------+
| 1 | a |
| 2 | c |
+------+------+
在SELECT
子句中使用子SELECT
是解决问题的简单方法:
SELECT ColA, (SELECT ColB
FROM yourtable i
WHERE i.ColA = o.ColA
GROUP BY ColB
ORDER BY COUNT(*) DESC
LIMIT 1) AS ColB
FROM yourtable o
GROUP BY ColA;
o
只是外部查询的别名, i
是内部查询的别名。 WHERE
子句的工作需要它们。
上面的查询是以下查询的结果,用于查找具有给定ColA
的ColB
最常见的ColA
:
SELECT ColB
FROM yourtable
WHERE ColA = 1 -- Replace 1; this is where the magic happens in the above query
GROUP BY ColB
ORDER BY COUNT(*) DESC
LIMIT 1
你必须为此创建我的 Sql 函数,假设你的函数名称是 getMaxOccr 所以它看起来像
CREATE FUNCTION `getMaxOccr`(val INT)
RETURNS varchar(25) CHARSET latin1
BEGIN
DECLARE answer VARCHAR(25) DEFAULT '';
SELECT colb FROM `tablename`
WHERE cola = val
ORDER BY COUNT(colb)
DESC INTO answer;
RETURN answer;
END
创建此函数后,您只需调用
SELECT cola,getMaxOccr(cola) from tablename GROUP BY cola
这将为您提供您正在寻找的列表希望这会有所帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.