Вычисление процента GROUP_BY с помощью оператора WHERE

#sql #amazon-redshift

#sql #amazon-redshift

Вопрос:

Допустим, у меня есть таблица с заказами со столбцами доходов и статуса. Я хочу сгруппировать заказы по группам доходов (сгруппированные с шагом 10) и получить процент, для которого в столбце статуса установлено значение 1 в соответствующей группе доходов. Я думал, что оконная функция — это правильный путь, но оператор where ограничивает столбцы, так что в итоге я получаю только столбцы, где status == 1 . Конечный результат будет выглядеть примерно так: 10 | 76% , и т.д. 20 | 50%

 SELECT CASE 
  WHEN revenue between 1 and 10 then 10
  WHEN revenue between 10 and 20 then 20
  WHEN revenue between 20 and 30 then 30
  WHEN revenue between 30 and 40 then 40
  WHEN revenue between 40 and 50 then 50
  else 60 
END as revgroup,
COUNT(*) / CAST(SUM(count(*)) over (partition by CASE 
  WHEN revenue between 1 and 10 then 10
  WHEN revenue between 10 and 20 then 20
  WHEN revenue between 20 and 30 then 30
  WHEN revenue between 30 and 40 then 40
  WHEN revenue between 40 and 50 then 50
else 60 END) as float) as percentage
from "order"
where "order".status = 1
group by revgroup
  

Ответ №1:

в вашем случае предложение PARTITION BY является избыточным, каждый раздел был создан с использованием предложения GROUP BY

 SELECT CASE 
  WHEN revenue between 1 and 10 then 10
  WHEN revenue between 10 and 20 then 20
  WHEN revenue between 20 and 30 then 30
  WHEN revenue between 30 and 40 then 40
  WHEN revenue between 40 and 50 then 50
  else 60 
END as revgroup,
COUNT(*) * 1.0 / SUM(COUNT(*)) OVER () as percentage
from "order"
where "order".status = 1
group by revgroup