簡體   English   中英

SQL 百分比 - 條件總和

[英]SQL Percentage - Conditional Sum

我想根據應用語言計算流失百分比並保留值。 我正在使用雪花。

我目前的情況如下:

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

輸出是

language churn_status user_count

因此,有了這個非常有想象力的數據(我在 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)
)

你的 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

我們得到:

CHURN_STATUS USER_COUNT PERCENT_CHURN
zh 一個 500 62.5
FR 一個 300 37.5

現在,如果您希望百分比為每個 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

給予:

CHURN_STATUS USER_COUNT PERCENT_CHURN
zh 一個 100 25
zh b 400 100
FR 一個 300 75

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM