У меня есть запрос SQL, который выполняет некоторые вычисления. Помимо простых изменений форматирования, мне интересно, возможно ли каким-то образом использовать CTE, чтобы этот запрос было легче читать? Я обнаружил несколько возможностей, когда использование CTE может существенно повлиять на понятность запроса, но выполнение этого запроса ускользает от меня.
Схема:
CREATE TABLE public.items (
id bigint NOT NULL,
uuid uuid NOT NULL,
);
CREATE TABLE public.download_counts (
item_id uuid NOT NULL,
date date NOT NULL,
download_count integer NOT NULL,
);
CREATE TABLE public.view_counts (
item_id uuid NOT NULL,
date date NOT NULL,
view_count integer NOT NULL,
);
Запрос:
select
i.uuid as item_id,
(
(
sum(dlw.download_count) * (
case
when sum(vlw.view_count) = 0 then sum(dlw.download_count)
else sum(vlw.view_count)
end
)
) - (
sum(dpw.download_count) * (
case
when sum(vpw.view_count) = 0 then sum(dpw.download_count)
else sum(vpw.view_count)
end
)
)
) * 100 / (
sum(dpw.download_count) * (
sum(dpw.download_count) * (
case
when sum(vpw.view_count) = 0 then sum(dpw.download_count)
else sum(vpw.view_count)
end
)
)
) as trending_score
from
items as i
left join download_counts as dlw
on dlw.item_id = i.uuid
and dlw.date between (now()::date - interval '1 week') and (now()::date - interval '1 day')
left join download_counts as dpw
on dpw.item_id = i.uuid
and dpw.date between (now()::date - interval '2 week') and (now()::date - interval '8 days')
left join view_counts as vlw
on vlw.item_id = i.uuid
and vlw.date between (now()::date - interval '1 week') and (now()::date - interval '1 day')
left join view_counts as vpw
on vpw.item_id = i.uuid
and vpw.date between (now()::date - interval '2 week') and (now()::date - interval '8 days')
where dlw.item_id is not null or dpw.item_id is not null or vlw.item_id is not null or vpw.item_id is not null
group by i.uuid;
Могу ли я использовать CTE или какую-либо другую технику рефакторинга для облегчения понимания этого запроса? Спасибо!