MySQL как сгруппировать по столбцу и сделать так, чтобы некоторые значения входили в 1 строку - PullRequest
0 голосов
/ 21 февраля 2019

Я хочу использовать функцию GROUP BY, чтобы сгруппировать столбец, взять несколько значений в этом столбце и объединить их все в одну строку в результате.Пример:

Таблица:

enter image description here

Запрос:

SELECT COUNT(device_id), version FROM MyTable GROUP BY version;

Результат:

enter image description here

Желаемый результат:

enter image description here

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Вы не сказали нам, каковы ваши критерии для принятия решения о том, следует ли агрегировать конкретную строку как «прочее», чтобы вы не получили однозначного ответа.

Существует 2 вероятныхСценарии, которые я могу себе представить - вы хотите разложить в зависимости от размера значения или его частоты.Если вы можете определить запрос, который возвращает ЛИБО данные, которые вы хотите сгруппировать, как «другие» ИЛИ данные, которые вы хотите перечислить по отдельности, то присоедините его обратно к исходному набору данных .....

 SELECT version, COUNT(*)
 FROM myTable
 GROUP BY version
 ORDER BY COUNT(*) DESC
 LIMIT 0,3

даст вамсамые популярные 3 версии, OTOH ...

 SELECT version
 FROM myTable
 ORDER BY version DESC
 LIMIT 0,3

даст вам самую последнюю версию (хотя вы столкнетесь с проблемами, так как нет простого способа , который я знаю, с которым можно справитьсямногозначный номер версии в MySQL - рассмотрите версию 3.0.9 против 3.0.200)

, следовательно ...

SELECT IFNULL(ilv.version, "other"), COUNT(*)
FROM myTable m
LEFT JOIN (
         SELECT version, COUNT(*)
         FROM myTable
         ORDER BY COUNT(*) DESC
         LIMIT 0,3
) ilv
ON m.version=ilv.version
GROUP BY IFNULL(ilv.version, "other")

Есть несколько значительно более эффективных способов получитьрезультат (для вышеприведенного требуется 2 полных прохода через данные), но использование подхода LEFT JOIN / подзапрос упрощает задачу переопределения «другой» классификации.

0 голосов
/ 21 февраля 2019

Вы можете построить два результата:

  SELECT COUNT(device_id) as version_count, 
         version 
  FROM MyTable 
  WHERE version IN ('3.0.3','3.0.2','2.9.5')
  GROUP BY version
  UNION
  SELECT COUNT(device_id) as version_count, 
         'Others' 
  FROM MyTable 
  WHERE version NOT IN ('3.0.3','3.0.2','2.9.5');

Оператор выбора слева от оператора объединения считает идентификаторы устройств по версии для трех заданных версий в примере.Оператор выбора справа от оператора объединения считает идентификаторы устройств для всех других версий (не для трех указанных версий).

...