[英]SQL Percentage - Conditional Sum
I want to calculate percentage churn and retain values according to app language.我想根据应用语言计算流失百分比并保留值。 I am using Snowflake.
我正在使用雪花。
My current is as follows:我目前的情况如下:
SELECT i.language, lb.churn_status, SUM(lb.total_users) AS user_count
FROM level_based_churn_retain_comparison AS lb
INNER JOIN sessions AS s
ON s.level_index=lb.level_index
INNER JOIN installs AS i
ON s.user_id=i.user_id
GROUP BY i.language, lb.churn_status
ORDER BY i.language, user_count
And the output is输出是
language churn_status user_count
So with this very imaginative data (that I have in a CTE to make it easy for me)因此,有了这个非常有想象力的数据(我在 CTE 中拥有的数据让我很容易)
with level_based_churn_retain_comparison(level_index, total_users, churn_status) as (
select * from values
(10, 100, 'a'),
(20, 400, 'a'),
(30, 300, 'a')
), installs(user_id, language) as (
select * from values
(1, 'en'),
(2, 'en'),
(3, 'fr')
), sessions(user_id, level_index) as (
select * from values
(1, 10),
(2, 20),
(3, 30)
)
your SQL + RATIO_TO_REPORT你的 SQL + RATIO_TO_REPORT
SELECT
i.language,
lb.churn_status,
SUM(lb.total_users) AS user_count,
100.0 * ratio_to_report(user_count) over() as percent_churn
FROM level_based_churn_retain_comparison AS lb
INNER JOIN sessions AS s
ON s.level_index = lb.level_index
INNER JOIN installs AS i
ON s.user_id = i.user_id
GROUP BY i.language, lb.churn_status
ORDER BY i.language, user_count
we get:我们得到:
LANGUAGE![]() |
CHURN_STATUS ![]() |
USER_COUNT ![]() |
PERCENT_CHURN ![]() |
---|---|---|---|
en ![]() |
a![]() |
500 ![]() |
62.5 ![]() |
fr ![]() |
a![]() |
300 ![]() |
37.5 ![]() |
Now if you want the percentage to be per churn_status, we can put that into the PARTITION BY clause, like so:现在,如果您希望百分比为每个 churn_status,我们可以将其放入 PARTITION BY 子句中,如下所示:
with level_based_churn_retain_comparison(level_index, total_users, churn_status) as (
select * from values
(10, 100, 'a'),
(20, 400, 'b'),
(30, 300, 'a')
), installs(user_id, language) as (
select * from values
(1, 'en'),
(2, 'en'),
(3, 'fr')
), sessions(user_id, level_index) as (
select * from values
(1, 10),
(2, 20),
(3, 30)
)
SELECT
i.language,
lb.churn_status,
SUM(lb.total_users) AS user_count,
100.0 * ratio_to_report(user_count) over(partition by lb.churn_status) as percent_churn
FROM level_based_churn_retain_comparison AS lb
INNER JOIN sessions AS s
ON s.level_index = lb.level_index
INNER JOIN installs AS i
ON s.user_id = i.user_id
GROUP BY i.language, lb.churn_status
ORDER BY i.language, user_count
giving:给予:
LANGUAGE![]() |
CHURN_STATUS ![]() |
USER_COUNT ![]() |
PERCENT_CHURN ![]() |
---|---|---|---|
en ![]() |
a![]() |
100 ![]() |
25 ![]() |
en ![]() |
b ![]() |
400 ![]() |
100 ![]() |
fr ![]() |
a![]() |
300 ![]() |
75 ![]() |
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.