#mysql #sql
#mysql #sql
Вопрос:
У меня возникли проблемы с группировкой следующего запроса:
SELECT id
, decile_clean
, COUNT(DISTINCT source) AS unique_sources
FROM uld_data_combined_rasterized
GROUP
BY id
, decile_clean
HAVING COUNT(DISTINCT source) = 3
------------ -------------- ----------------
| id | decile_clean | unique_sources |
------------ -------------- ----------------
| a003123084 | Decile4to8 | 3 |
| a003801358 | Decile4to8 | 3 |
| a003867284 | Decile4to8 | 3 |
| a003906322 | Decile4to8 | 3 |
| a013137918 | Decile4to8 | 3 |
| a023038908 | Decile4to8 | 3 |
| a023038981 | Decile4to8 | 3 |
| a023051265 | Decile4to8 | 3 |
| a023061728 | Decile4to8 | 3 |
| a023123080 | Decile9to10 | 3 |
| a023216405 | Decile1to3 | 3 |
Результат, который я ищу, является:
------------ --------------
| decile_clean | count |
------------ --------------
| Decile4to8 | 9 |
| Decile9to10 | 1 |
| Decile1to3 | 1 |
Я пытался смешать кучу разных запросов вместе в течение последних 2 часов, но, похоже, не получается.
Моя исходная таблица выглядит следующим образом:
-------------- -------------- ------ ----- --------- -------
| Field | Type | Null | Key | Default | Extra |
-------------- -------------- ------ ----- --------- -------
| id | varchar(255) | YES | | NULL | |
| date | date | YES | | NULL | |
| source | varchar(11) | NO | | | |
| decile_clean | varchar(11) | YES | | NULL | |
-------------- -------------- ------ ----- --------- -------
Ответ №1:
Похоже, что это два уровня агрегирования:
SELECT decile_clean, COUNT(*)
FROM (SELECT id, decile_clean, COUNT(DISTINCT source) AS unique_sources
FROM uld_data_combined_rasterized
GROUP BY id,decile_clean
HAVING COUNT(DISTINCT source) = 3
) d
GROUP BY decile_clean
Комментарии:
1. Ты мужчина! Я был близок к мысли, что мне нужно выполнить запрос from … но не смог собрать его воедино. Большое вам спасибо. Я приму ответ через 9 минут, когда это позволит мне!
2. Нет необходимости указывать КОЛИЧЕСТВО в списке выбора, это необходимо только в
HAVING
. Или измените наHAVING unique_sources = 3
, чтобы избежать избыточности.
Ответ №2:
Для MySQL 8.0 вы можете использовать COUNT()
функцию window:
SELECT DISTINCT
decile_clean,
COUNT(*) OVER (PARTITION BY decile_clean) AS count
FROM uld_data_combined_rasterized
GROUP BY id, decile_clean
HAVING COUNT(DISTINCT source) = 3
Комментарии:
1. Приятно знать, к сожалению, я забыл упомянуть, что я запускаю это на 5.6 из-за некоторых проблем с совместимостью (GCP пока не поддерживает 8).