将固定数量按重量除以多行

时间:2018-11-12 13:30:24

标签: sql tsql

所以我有一个具有以下结构的表:

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

2 个答案:

答案 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