sql中无循环的均匀分布
我需要为用户分配订单数量。 假设有3个订单和5个用户sql中无循环的均匀分布,sql,sql-server,Sql,Sql Server,我需要为用户分配订单数量。 假设有3个订单和5个用户 users orders us1 1 us2 1 us3 1 us4 0 us5 0 11个订单和5个用户 users orders us1 2 us2 2 us3 2 us4 2 us5 3 DECLARE @countInterval int = 13 --DECLARE @sum int = 5 DECLARE @countUser int
users orders
us1 1
us2 1
us3 1
us4 0
us5 0
11个订单和5个用户
users orders
us1 2
us2 2
us3 2
us4 2
us5 3
DECLARE @countInterval int = 13
--DECLARE @sum int = 5
DECLARE @countUser int = 5
Update DistributionBasesUsers
SET @countUser=@countUser-1, @countInterval=@countInterval-2, DistributionBaseCountOrder=
CASE
WHEN @countUser>0 THEN FLOOR(@countInterval/@countUser) ELSE 0
--WHEN FLOOR(@countInterval/@countUser)<0 THEN @countInterval%5
--WHEN FLOOR(@countInterval/@countUser)=0 THEN 0
END
用户订单
美国1 2
美国2
us3 2
美国4 2
美国5 3
声明@countInterval int=13
--声明@sum int=5
声明@countUser int=5
更新DistributionBasesUsers
设置@countUser=@countUser-1、@countInterval=@countInterval-2、DistributionBaseCountOrder=
案例
当@countUser>0时,则为楼层(@countInterval/@countUser),否则为0
--当FLOOR(@countInterval/@countUser)时,我得到了与您要求的类似的东西。对于第二个示例,我给出的结果与您的不同,我不确定更新的目的是什么:
declare @t table (users char(3))
insert into @t(users) values
('us1'),
('us2'),
('us3'),
('us4'),
('us5')
declare @orderCount int
set @orderCount = 13
;With CountedNumbered as (
select
*,
COUNT(*) OVER () as Cnt,
ROW_NUMBER() OVER (ORDER BY users) as Rn
from
@t
)
select
users,
(@orderCount / Cnt) +
CASE WHEN @orderCount % Cnt >= Rn THEN 1 ELSE 0 END as orders
from
CountedNumbered
结果:
users orders
----- -----------
us1 3
us2 3
us3 3
us4 2
us5 2
如果我们在@t
中添加一个可为空的orders int
列,那么我们可以将最终查询更改为:
update CountedNumbered
set orders =
(@orderCount / Cnt) +
CASE WHEN @orderCount % Cnt >= Rn THEN 1 ELSE 0 END
如果这是更新的目的
。(如果您以前没有看到过,通过进行更新可能会引起不安)您使用的是MySQL还是MS SQL Server?(不要添加不相关的标签)等等,这里的逻辑是什么?在您的第一个示例中,当用户数量没有准确地除以订单数量时,较低数量的用户似乎收到了“超额”。但在您的第二个示例中,情况似乎正好相反。对不起,我正在使用MS SQLNice tip(更新CTE)。另一个级别:您也可以更新基于cte的表值函数:)