SQL получает количество повторяющихся значений в поле

У меня есть таблица, похожая на следующую. (Адреса на самом деле являются IP-адресами, но я сокращаю их для простоты.)

| Cust ID | Address |
| ------- | --------|
|    1    | 111     |
|    1    | 222     |
|    1    | 222     |
|    1    | 222     |
|    1    | 333     | 
|    2    | 444     | 
|    2    | 444     | 
|    2    | 444     |
|    2    | 444     |
|    3    | 555     | 

Я хотел бы получить количество разных адресов для каждого клиента, отсортированных по количеству:

| Cust ID | Address | Count |
| ------- | --------|-------|
|    2    | 444     |   4   |
|    1    | 222     |   3   |
|    1    | 111     |   1   |
|    1    | 333     |   1   |
|    3    | 555     |   1   |

Итак, как указано выше, клиент 2 использовал адрес 444 четыре раза; клиент 1 трижды использовал адрес 222, один раз 111 и один раз 333; и т. д.

FWIW, я использую mysql.

Спасибо!

🤔 А знаете ли вы, что...
С MySQL можно создавать полнотекстовый поиск и выполнение сложных аналитических запросов.


57
3

Ответы:

Решено
SELECT   CustID, Address, COUNT(*)
FROM     Cust
GROUP BY CustID, Address
ORDER BY COUNT(*) DESC;

Хорошее эмпирическое правило при использовании GROUP BY — передавать ему все выбранные столбцы, не используемые COUNT.


выберите идентификатор клиента, Адрес, count(Address) as Count

из Каста

Группировка по CustId, Адресу;


Чтобы агрегировать частоту адресов среди различных идентификаторов клиентов, предложение GROUP BY используется в сочетании с предложением COUNT для определения частоты адресов для каждого идентификатора клиента.

SELECT Cust ID, Address, COUNT(*) FROM TABLE GROUP BY Cust ID, Address ORDER BY COUNT(*) DESC;

Обратите внимание, что для предложения GROUP BY и идентификатор клиента, и адрес группируются. COUNT(*) используется для подсчета всех записей, которые появляются в каждой группе.

В качестве другого примера, если бы кто-то хотел определить только частоту адресов, не принимая во внимание, какому идентификатору клиента они принадлежат, можно было бы сгруппировать только по адресу:

SELECT Address, COUNT(*) FROM TABLE GROUP BY Address ORDER BY COUNT(*) DESC;

Однако группировка по нескольким столбцам (как в первом случае) сужает результаты, чтобы обеспечить рассмотрение агрегатов по обоим соответствующим столбцам.