首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >每条记录的总百分比占总和的百分比。Presto/Athena/SQL

每条记录的总百分比占总和的百分比。Presto/Athena/SQL
EN

Stack Overflow用户
提问于 2021-10-19 13:28:54
回答 2查看 75关注 0票数 0

我正在尝试计算每行Presto/Athena的累积百分比。例句:如果我有这样的数据

代码语言:javascript
复制
AccountID | UserID | HolidaysTaken
ABC       | A      | 4
ABC       | B      | 6
ABC       | B      | 3
ABC       | K      | 2
ABC       | K      | 3
ABC       | X      | 1

现在,在运行这个查询之后,我得到了以下结果。

代码语言:javascript
复制
SELECT AccountID, UserID, sum(HolidaysTaken) AS HolidaysTaken FROM table
WHERE AccountID = 'ABC'
GROUP BY AccountID, UserID
ORDER BY HolidaysTaken DESC

AccountID | UserID | HolidaysTaken 
ABC       | B      | 9             
ABC       | K      | 5             
ABC       | A      | 4             
ABC       | X      | 1 

Total holiday taken by all users = 19         

但是我想再添加两列。EachUserPercentage:每个用户的假期占总假期的百分比。CumulativePercentage:EachUserPercentage的累积和。我可以使用this post来完成这个任务

代码语言:javascript
复制
AccountID | UserID | HolidaysTaken | EachUserPercentage | CumulativePercentage
ABC       | B      | 9             | 47.36              | 47.36  
ABC       | K      | 5             | 26.31              | 73.67
ABC       | A      | 4             | 21.05              | 94.72
ABC       | X      | 1             | 5.26               | 100

我尝试了比较窗口函数percent_rank(), cume_dist() and ntile(),但是不能让EachUserPercentage正常工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-19 13:56:00

您可以使用窗口函数来查找AccountID的百分比,然后使用另一个窗口函数对前面未绑定的行求和,按每个UserID占用的总假期排序。如下所示:

代码语言:javascript
复制
WITH totalUser
AS (SELECT   AccountID
            ,UserID
            ,SUM(HolidaysTaken) AS HolidaysTaken
            ,CAST(100.0 * SUM(HolidaysTaken) / SUM(SUM(HolidaysTaken)) OVER (PARTITION BY AccountID) AS NUMERIC(5, 2)) AS EachUserPercentage
    FROM     table
    WHERE    AccountID = 'ABC'
    GROUP BY AccountID
            ,UserID)
SELECT   totalUser.AccountID
        ,totalUser.UserID
        ,totalUser.HolidaysTaken
        ,totalUser.EachUserPercentage
        ,SUM(totalUser.EachUserPercentage) OVER (PARTITION BY totalUser.AccountID
                                                 ORDER BY totalUser.EachUserPercentage DESC
                                                 ROWS UNBOUNDED PRECEDING)
FROM     totalUser
ORDER BY totalUser.HolidaysTaken DESC;
票数 2
EN

Stack Overflow用户

发布于 2021-10-19 14:01:58

您好,您可以从下面的查询中获得简单的EachUserPercentage,如果您的组在AccountID上(考虑)。

代码语言:javascript
复制
SELECT table.AccountID, UserID, sum(table.HolidaysTaken) AS HolidaysTaken,
MAX(CAST(all_sum.HolidaysTaken AS NUMERIC(12,2))),
(SUM(CAST(table.HolidaysTaken AS NUMERIC(12,2)))/MAX(CAST(all_sum.HolidaysTaken AS NUMERIC(12,2))))*100 EachUserPercentage
 FROM table
LEFT OUTER JOIN (SELECT SUM(HolidaysTaken) AS HolidaysTaken,AccountID FROM table GROUP BY AccountID)all_sum ON all_sum.AccountID= table.AccountID
WHERE table.AccountID = 'ABC'
GROUP BY table.AccountID, UserID
ORDER BY HolidaysTaken DESC

它在我这一端起作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69631750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档