[英]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.