#sql #google-bigquery #left-join
#sql #google-bigquery #левое соединение
Вопрос:
У меня есть следующий запрос:
SELECT t.date,
t.transactionId,
t.channelGrouping,
tp.itemRevenue,
t.transactionItemQuantity,
t.company,
t.campaign,
ifnull(replace((regexp_extract(tp.productCategory, r"(^[a-zA-Z0-9_.amp;; -] )")),"amp;amp;", "amp;"), "N/A") as productCategory,
ifnull(sum(a.adCost),0) as adCost
FROM `kpi.TransactionsByChannel` t left join kpi.TransactionProducts tp
on tp.transactionId = t.transactionId
left join kpi.Ads a
on a.company = t.company and a.date = t.date and a.campaign = t.campaign group by 1,2,3,4,5,6,7,8
которая возвращает мне результат:
Однако, как вы можете видеть, adCost неверен и дублируется. Мне нужно получить ее соотношение на основе itemRevenue или просто написать первую строку, а остальные строки должны быть равны 0.
Я попробовал следующий запрос:
SELECT t.date,
t.transactionId,
t.channelGrouping,
tp.itemRevenue,
t.transactionItemQuantity,
t.company,
t.campaign,
ifnull(replace((regexp_extract(tp.productCategory, r"(^[a-zA-Z0-9_.amp;; -] )")),"amp;amp;", "amp;"), "N/A") as productCategory,
round(adCost*(itemRevenue/SUM(itemRevenue) over (partition by tp.company, tp.productCategory, tp.date)),2) as adCost_adjusted,
FROM kpi.TransactionsByChannel t left join kpi.TransactionProducts tp
on tp.transactionId = t.transactionId
left join kpi.Ads a
on a.company = t.company and a.date = t.date and a.campaign = t.campaign group by 1,2,3,4,5,6,7,8,9
но я получаю сообщение об ошибке:
Column 9 contains an analytic function, which is not allowed in GROUP BY at [13:99]
Любая помощь была бы действительно оценена!
Комментарии:
1. Вы не можете
GROUP BY
aSUM()
. Весь смысл аналитических функций заключается в том, чтобы вычислять что-либо по группе строк, выбранныхGROUP BY
. Каков желаемый результат?2. Просто удалите столбец, который вы вставили
SUM()
из вашегоGROUP BY
предложения.3. @Kaii Но я хочу получить соотношение доходов и разделить стоимость рекламы на основе этого. Чтобы вычислить это, мне нужна сумма. Как я должен с этим разобраться?
4. @Kaii желаемый результат: вместо того, чтобы повторять adCost 4 раза (63,87), разделить 63,87 на 4 на основе коэффициента дохода.
Ответ №1:
Попробуйте что-то вроде этого подхода:
with ttr as
(
select
t.transactionId,
sum(tp.itemRevenue) as TotalItemRevenue
from
`kpi.TransactionsByChannel` t
inner join
kpi.TransactionProducts tp
on
tp.transactionId = t.transactionId
group by
t.transactionId
)
SELECT
t.date,
t.transactionId,
t.channelGrouping,
tp.itemRevenue,
t.transactionItemQuantity,
t.company,
t.campaign,
ifnull(replace((regexp_extract(tp.productCategory, r"(^[a-zA-Z0-9_.amp;; -] )")),"amp;amp;", "amp;"), "N/A") as productCategory,
ifnull(a.adCost,0) * tp.itemRevenue / ttr.TotalItemRevenue as adCost_adjusted
FROM
`kpi.TransactionsByChannel` t
inner join
ttr
on
t.transactionId = ttr.transactionId
inner join
kpi.TransactionProducts tp
on
tp.transactionId = t.transactionId
left join
kpi.Ads a
on
a.company = t.company
and a.date = t.date
and a.campaign = t.campaign