Найдите наиболее частое значение в столбце SQL

122

Как найти наиболее частое значение в заданном столбце в таблице SQL?

Например, для этой таблицы он должен возвращаться, twoпоскольку это наиболее частое значение:

one
two
two
three
Джейк
источник
1
ГРУППА ПО версии: stackoverflow.com/questions/344665/get-most-common-value-in-sql
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
А как насчет галстуков? Добавьте еще одну строку «три» к образцу данных и укажите ожидаемый результат.
jarlh

Ответы:

181
SELECT       `column`,
             COUNT(`column`) AS `value_occurrence` 
    FROM     `my_table`
    GROUP BY `column`
    ORDER BY `value_occurrence` DESC
    LIMIT    1;

Заменить columnи my_table. Увеличьте, 1если хотите увидеть Nнаиболее распространенные значения столбца.

Михай Станку
источник
1
что мне делать, если я хочу выбрать и другие поля из my_table? Другими словами, другое значение;
grep
7
что, если более одного значения появляется одинаковое количество раз (максимальное количество)? В таком случае, если три тоже появятся дважды? LIMIT 1 покажет только одну запись
mustafa1993
1
@ mustafa1993SELECT * FROM my_table GROUP BY value ORDER BY count(*) DESC;
Ахмед Сайед
почему не работает, когда я добавляю WHERE 'value_occurrence' = 1?
swisswiss
1
@swisswiss вы должны использовать HAVINGвместо WHEREв этом случае.
HellBaby
47

Попробуйте что-нибудь вроде:

SELECT       `column`
    FROM     `your_table`
    GROUP BY `column`
    ORDER BY COUNT(*) DESC
    LIMIT    1;
Мат
источник
6
Я не знал, что вы можете использовать его COUNT(*)прямо в ORDER BY. Я знал, что существует несколько ограничений относительно GROUP BY/ HAVINGи агрегированных столбцов, и всегда предполагал, что это не сработает.
Михай Станку
21

Рассмотрим имя таблицы как tblpersonи имя столбца как city. Я хочу получить наиболее повторяющийся город из столбца города:

 select city,count(*) as nor from tblperson
        group by city
          having count(*) =(select max(nor) from 
            (select city,count(*) as nor from tblperson group by city) tblperson)

Вот norпсевдоним.

Нэвин
источник
+1 для использования стандартного SQL, который будет работать в любой базе данных (в то время как LIMIT относится к MySQL, а TOP - к SQL Server).
Дилан Смит
7

Ниже запрос, похоже, хорошо работает для меня в базе данных SQL Server:

select column, COUNT(column) AS MOST_FREQUENT
from TABLE_NAME
GROUP BY column
ORDER BY COUNT(column) DESC

Результат:

column          MOST_FREQUENT
item1           highest count
item2           second highest 
item3           third higest
..
..
Свадхикар C
источник
3

Для использования с SQL Server.

Поскольку в этом нет поддержки команды limit.

Вы можете использовать команду top 1, чтобы найти максимальное значение, встречающееся в конкретном столбце в этом случае (значение)

SELECT top1 
    `value`,
    COUNT(`value`) AS `value_occurrence` 
FROM     
    `my_table`
GROUP BY 
    `value`
ORDER BY 
    `value_occurrence` DESC;
Муниб Хасан
источник
Вам также необходимо переместить функцию COUNT в раздел ORDER BY, чтобы избежать следующей ошибки: в списке выбора может быть указано только одно выражение, если подзапрос не вводится с EXISTS
Саба Джамалиан
1

Предположим, что таблица - это ' SalesLT.Customer', а столбец, который вы пытаетесь вычислить, ' CompanyName' и AggCompanyNameявляется псевдонимом.

Select CompanyName, Count(CompanyName) as AggCompanyName from SalesLT.Customer
group by CompanyName
Order By Count(CompanyName) Desc;
Музаммель Мукул
источник
0

Если вы не можете использовать LIMIT, или LIMIT не подходит для вашего инструмента запросов. Вместо этого вы можете использовать ROWNUM, но вам понадобится подзапрос:

SELECT FIELD_1, ALIAS1
FROM(SELECT FIELD_1, COUNT(FIELD_1) ALIAS1
    FROM TABLENAME
    GROUP BY FIELD_1
    ORDER BY COUNT(FIELD_1) DESC)
WHERE ROWNUM = 1
Roadkill
источник
MySQL не имеетROWNUM
Бармар
Это верно для Oracle, но не для MySQL
Прабху
1
@Prabhu в MySQL LIMIT 1вместо этого вы используете ; синтаксис показан в принятом ответе.
ToolmakerSteve
0

Если у вас есть столбец идентификатора, и вы хотите найти наиболее повторяющуюся категорию из другого столбца для каждого идентификатора, вы можете использовать запрос ниже,

Стол:

Содержание таблицы

Запрос:

SELECT ID, CATEGORY, COUNT(*) AS FREQ
FROM TABLE
GROUP BY 1,2
QUALIFY ROW_NUMBER() OVER(PARTITION BY ID ORDER BY FREQ DESC) = 1;

Результат:

Результат запроса

Маюр Мане
источник
-1

Один из способов, который мне нравится использовать:

Выбрать , COUNT () как VAR1 из Table_Name

группа по

заказать по VAR1 по убыванию

предел 1

Омар Лари
источник