SQL группировать по sum() и выбирать первым в денормализованных данных

#sql

#sql

Вопрос:

У меня есть следующие денормализованные данные:

 ╔════╦═══════╦══════════╦════════════╗
║ id ║ value ║ group_id ║ group_name ║
╠════╬═══════╬══════════╬════════════╣
║  0100Group 0    ║
║  1100Group 0    ║
║  2100Group 0    ║
║  3100Group 0    ║
║  4101Group 1    ║
║  5101Group 1    ║
║  6101Group 1    ║
║  7102Group 2    ║
║  8102Group 2    ║
║  9102Group 2    ║
╚════╩═══════╩══════════╩════════════╝
 

В настоящее время я выполняю запрос, который суммирует значение по group_id :

 select sum(value), group_id
from table
group by group_id
 

Как мне расширить этот запрос, чтобы также включить group_name для каждого столбца? Мне нужно, чтобы мой результат выглядел так:

 ╔═══════╦══════════╦════════════╗
║ value ║ group_id ║ group_name ║
╠═══════╬══════════╬════════════╣
║    400Group 0    ║
║    301Group 1    ║
║    302Group 2    ║
╚═══════╩══════════╩════════════╝
 

Это единственный способ сделать это для использования OVER ?

Комментарии:

1. select group_name,group_id,sum(value) from table group by group_name,group_id

Ответ №1:

У вас есть два варианта. Одним из них является использование функции агрегирования:

 select sum(value), group_id, max(group_name) as group_name
from table
group by group_id;
 

Второй — включить столбец, не объединенный в select и group by :

 select sum(value), group_id, group_name
from table
group by group_id, group_name;
 

Ответ №2:

  • Пожалуйста, укажите поставщика БД.
  • Ваш запрос select sum(value), group_id from table недействителен, я предполагаю, что вы выполняете select sum(value), group_id from table group by group_id .
  • Предполагая, что вы доверяете своей денормализации и group_name всегда зависите от group_id нее, вы можете просто добавить group_name в group by и select предложение: select sum(value), group_id, group_name from table group by group_id, group_name

Ответ №3:

Используйте group by !

 select sum(value) as value, group_id, group_name
from mytable
group by group_id, group_name
 

В стандартном SQL ваш исходный запрос не является допустимым запросом агрегации для начала. Все неагрегированные столбцы должны отображаться в group by предложении (поэтому вам нужен group by group_id`), хотя некоторые базы данных (а именно MySQL) можно настроить, чтобы разрешить иное.

Комментарии:

1. ах, это так просто?