Объединить длинный хвост группы по запросу в «другие» - PullRequest
0 голосов
/ 24 октября 2018

У меня есть таблица с одним измерением и одной метрикой:

name metric
A   4
A   9
B   27
C   9
D   6

Я хочу сгруппировать по измерению, а затем сгруппировать длинный хвост результатов в «другие» или «остальную частьdata 'label.

Например, мой запрос должен вернуть все имена, сумма их метрик которых больше 10, и сгруппировать остальные в «другие»:

name    metric
A       13
others  15
B       27

Я могу получитьэтот результат путем агрегации дважды:

with T as ( 
  select 
    name
  , (case when sum(metric) > 10 then name else 'others' end) as group_name
  , sum(metric) as metric
  from MyData
  group by name
)

select 
  group_name as name
, sum(metric) as metric 
from T 
group by group_name
order by metric

Можно ли сделать это за одну операцию без использования подзапросов?

Фрагмент SQL

1 Ответ

0 голосов
/ 24 октября 2018

Я почти уверен, что для этого требуется два уровня агрегации, потому что исходные данные не содержат информации для группировки имен.Вам нужна одна агрегация для классификации имен и одна для вычисления окончательных результатов.

Тем не менее, я бы написал это как:

select (case when sum_metric > 10 then name else 'others' end) as group_name,
       sum(sum_metric) as metric
from (select name, sum(metric) as sum_metric
      from mydata
      group by name
     ) t
group by group_name;

При этом вы можете использовать select distinct иоконная функция для чего-то непостижимого, например:

select distinct (case when sum(metric) > 10 then name else 'others' end),
       sum(sum(metric)) over (partition by (case when sum(metric) > 10 then name else 'others' end)) as metric
from mydata
group by name;

Однако select distinct действительно выполняет другую агрегацию.Таким образом, это устраняет подзапрос, но не работу.

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