我有以下问题。
我需要列,我希望每个唯一条目第一列是第二列中最常用的元素。一个例子是:
COL A COL B
1 a
2 c
2 c
1 a
1 b
2 d
查询应输出:
Col A COL B
1 a
2 c
答案 0 :(得分:1)
鉴于此样本数据:
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 |
+------+------+
答案 1 :(得分:0)
在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
条款才能工作。
上述查询是以下查询的结果,用于查找具有给定ColB
的{{1}}最常见的出现:
ColA
答案 2 :(得分:-2)
你必须为此创建我的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
这将为您提供所需内容的列表希望这有助于