所以我有一个具有以下结构的表:
Id - Team - User - Weight
例如:在一个团队中,我们的目标是达到500个来电,因此我必须按权重将500个来电分配给团队中的每个用户,这样我才能得到此结构:
Id - Team - User - Weight - # Calls to be made
我知道我可以使用OVER(partition by)来做到这一点,并且效果很好,除了一个小细节,无法打个电话。
我需要这种分布不带逗号。
基本查询:
select Id,Team,User,Weight from CallList
4 ED PEDRO 1
5 RE PEDRO 1
6 PO ROOEIC 0,5
7 PO ROOEIC01 0,5
1 AP APSYSL 0,333333333333333
2 AP APSYSL01 0,333333333333333
3 AP APSYSL02 0,333333333333333
这就是我想要退回的东西
4 ED PEDRO 1 500
5 RE PEDRO 1 500
6 PO ROOEIC 0,5 250
7 PO ROOEIC01 0,5 250
1 AP APSYSL 0,333333333333333 167
2 AP APSYSL01 0,333333333333333 167
3 AP APSYSL02 0,333333333333333 166
答案 0 :(得分:1)
这是一个算术问题。这个想法是为团队中的每个id
获取一个“基本”值。然后计算多余的金额,然后逐步添加多余的金额。
select t.*,
(start_value +
(case when row_number() over (partition by team order by id) <= excess
then 1 else 0
end)
) as calls
from (select t.*,
floor(weight * 500) as start_value,
500 - sum(floor(weight * 500)) over (partition by team) as excess
from t
) t;
这将添加第一行中的多余内容。您似乎想要从最后一行开始。您可以使用order by id desc
中的row_number()
来实现。
答案 1 :(得分:0)
简化戈登的逻辑以删除派生表:
SELECT *
,floor(500 * weight) -- always <= 500
+ CASE -- check if there's a remainder n, if yes split it across n rows
WHEN COUNT(*) -- get a (kind of) random row, using row_number/order you might define a specific row
OVER (PARTITION BY Team
ROWS UNBOUNDED PRECEDING)
<= (500 - SUM(floor(500*weight)) -- remainder calculation
OVER (PARTITION BY Team))
THEN 1
ELSE 0
END
FROM CallList