#sql #analytic-functions
#sql #аналитические функции
Вопрос:
Я пытаюсь вычислить текущий% по результату двух подсчетов (как показано в приведенном ниже отрывке SQL) из таблицы в обычном SQL, которая выглядит следующим образом:
Мои мысли таковы:
SELECT week(beginning),
(select count(enquired_at) from TABLE) / (select count(*) from TABLE) * 100 OVER (partition by beginning order by beginning desc)
Я хотел бы получить результирующий набор, который выглядит следующим образом:
Как бы человек взял это арифметическое вычисление и сделал так, чтобы оно вычислялось кумулятивно с 1-й недели начала и далее?
Спасибо!
Комментарии:
1. Ваше описание неясно. Пожалуйста, покажите результаты, которые вы хотите, и объясните логику явно («результат двух подсчетов» является неопределенным). Также отметьте используемую вами базу данных.
2. Спасибо, Гордон — я отредактировал свой пост, чтобы попытаться уточнить.
Ответ №1:
Основываясь на вашем запросе, вы, похоже, хотите, чтобы количество раз, когда выполняется подсчет enquired_at
, не было нулевым. Если это так:
select t.*,
( count(enquired_at) over (order by beginning) * 1.0 /
count(*) over (order by beginning)
) as ratio
from t;
Или проще как:
select t.*,
avg(case when enquired_at is not null then 1.0 else 0 end) over (order by beginning) as ratio
from t
Редактировать:
Вы можете поместить это в запрос агрегации:
select week(beginning),
( sum(count(enquired_at)) over (order by min(beginning)) * 1.0 /
sum(count(*)) over (order by min(beginning))
) as ratio
from t
group by week(beginning);