MySQL ORDER BY TOP 20 и затем объедините все оставшиеся результаты в одну строку - PullRequest
0 голосов
/ 31 марта 2020

Допустим, следующий набор данных:

item    |    amount    |    total_items

beer            5                10
beans           5                15

... et c

Представьте, что есть 100 элементов. Я хочу SELECT TOP 20 ITEMS ORDER BY AMOUNT DESC. Это оставит 80 элементов, которые я хочу объединить / объединить в одну item строку с именем "Other", где ее столбец amount будет SUM из amount s из этих 80 строк, те же логики c для total_items. Это означает, что из начальных 100 строк останется только 21.

Можно ли сделать это одним запросом? Подход, о котором я думаю, следующий:

1) ВЫБЕРИТЕ ТОП 20 и сохраните в таблице # temp1

2) ВЫБЕРИТЕ остальное и сохраните в таблице # temp2

3) ВЫБЕРИТЕ СУММЫ amount и total_items из # temp2, чтобы он стал одной строкой

4) Объедините два результата вместе

Конечно, должно быть лучше и больше эффективный способ сделать это.

1 Ответ

1 голос
/ 31 марта 2020

Вы можете использовать оконные функции:

select (case when seqnum <= 20 then item else 'rest' end) as item,
       sum(amount)
from (select it.*, row_number() over (order by amount desc) as seqnum
      from items i
     ) i
group by (case when seqnum <= 20 then item else 'rest' end) 
order by max(seqnum) desc;

Это присваивает порядковый номер каждой строке на основе суммы (наибольшая сумма = 1). Затем он объединяет 20 самых высоких значений, помещая все остальное в 21-ю группу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...