2015-11-26 4 views
1

У меня есть следующий вопрос.Учет наиболее частого элемента в столбце 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 
+0

Count (ID) в общем, порядке по возрастанию группы по идентификатору и limit2 –

+0

You для этого нужно использовать 'Window'. К сожалению, MySQL не поддерживает их. Другой способ - использовать подзапрос в качестве столбца. –

ответ

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 

Тогда вы можете нас e этот запрос как подзапрос, чтобы получить строки, где определенный столбец содержит максимум. Там хорошая статья об этом в руководстве: 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 | 
+------+------+ 
-2

вам нужно создать функцию My 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 

это даст вам список с тем, что вы ищете надеюсь, что это помогает

+0

Функции часто представляют собой плохую идею, если вы можете избежать их со стандартным SQL. –

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 с данной 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 
Смежные вопросы