运行 每条记录占总和的总百分比。 Presto/Athena/SQL
Running total percentage per record over total sum. Presto/Athena/SQL
我正在尝试计算每一行的累计百分比 Presto/Athena。例如:如果我有这样的数据
AccountID | UserID | HolidaysTaken
ABC | A | 4
ABC | B | 6
ABC | B | 3
ABC | K | 2
ABC | K | 3
ABC | X | 1
现在在 运行 这个查询之后我得到以下结果。
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
但我想再添加 2 列。
EachUserPercentage
:每个用户的假期占总假期的百分比。
CumulativePercentage
:EachUserPercentage 的累计和。这个我可以用
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
我尝试了 diff window 函数 percent_rank(), cume_dist() and ntile()
但无法正常工作 EachUserPercentage
。
您可以使用 window 函数查找 AccountID 的百分比,然后使用另一个 window 函数对按每个 UserID 休假总数排序的未绑定行求和。如下所示:
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;
您好,如果您的组在 AccountID(已考虑)上,您可以从下面的查询中简单地获取 EachUserPercentage。
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
它在我这边有效。
我正在尝试计算每一行的累计百分比 Presto/Athena。例如:如果我有这样的数据
AccountID | UserID | HolidaysTaken
ABC | A | 4
ABC | B | 6
ABC | B | 3
ABC | K | 2
ABC | K | 3
ABC | X | 1
现在在 运行 这个查询之后我得到以下结果。
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
但我想再添加 2 列。
EachUserPercentage
:每个用户的假期占总假期的百分比。
CumulativePercentage
:EachUserPercentage 的累计和。这个我可以用
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
我尝试了 diff window 函数 percent_rank(), cume_dist() and ntile()
但无法正常工作 EachUserPercentage
。
您可以使用 window 函数查找 AccountID 的百分比,然后使用另一个 window 函数对按每个 UserID 休假总数排序的未绑定行求和。如下所示:
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;
您好,如果您的组在 AccountID(已考虑)上,您可以从下面的查询中简单地获取 EachUserPercentage。
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
它在我这边有效。