SQL для группирования по группам при подсчете связанного столбца

#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).