Задать вопрос
@Apxu

Хитрая SQL группировка, как сделать?

Всем привет. Недавно столкнулся с нестандартной группировкой и хотелось бы понять, реально ли такое вообще сделать на чистом sql?

Например есть таблица
id | должность
1 | Сапожник
2 | Сапожник
3 | Сапожник

Нужно сделать так, чтобы sql выдал 2 записи,

Сапожник | 2
Сапожник | 1

Т.е. 2 и 1 это количество, и нужно именно группировать по 2 записи, если таких сапожников будет 5, то и в результате нужно получить 3 записи
Сапожник | 2
Сапожник | 2
Сапожник | 1

Есть ли идеи? Заранее благодарен!
  • Вопрос задан
  • 273 просмотра
Подписаться 2 Средний 4 комментария
Решения вопроса 1
erge
@erge
Примус починяю
SELECT
    position, count(1) AS n
  FROM (
    SELECT
        position, row_number() OVER (PARTITION BY position) rn
      FROM tbl
  ) t
  GROUP BY position, (rn+1) div 2
;

см. пример на https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=50eda5...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@x_shader
Oracle & Coffee
MySQL 8+
Идея такая (в порядке, обратном глубине вложенности):

1) Пронумеровать строки непрерывной последовательностью, отсортировав по id
2) Вывести для каждой строки остаток от деления номера строки на 2
3) Вывести для каждой строки сумму по столбцу остатка от деления нарастающим итогом (sum(mod_column) over (order by row_number))
4) Сгруппировать по полю этой суммы
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы