sql - 用户分配订单
问题描述
我有订单和用户。我为每个用户的订单平均分配。添加新用户时,我需要重新分配。并且有必要考虑算法中已完成和限制之间的差异。如果用户对第一个分布进行了限制,则他们不会将其包含在新分布中,并将该列暴露给来自该列的限制值。
declare @orderCount int
set @orderCount = 50 --Orders for Distribution
--Result table
declare @t table (
users char(3),
limit int,
Made int
)
--Add users
insert into @t (users, limit, Made) values
('us1',0,0),
('us2',0,0),
('us3',0,0)
--Table for the Distribution algorithm
declare @c table (
users char(3),
limit int,
Made int,
Cnt int,
Rn int
)
--Count users and row_number
insert into @c
select
*,
COUNT(*) OVER () as Cnt,
ROW_NUMBER() OVER (ORDER BY users) as Rn
from
@t
--var for check new distribution>made
DECLARE @check int = 0
--Distribution
update t
set @check = (@orderCount/Cnt) + CASE WHEN @orderCount % Cnt >= Rn THEN 1 ELSE 0 END,
limit=
CASE WHEN
(@check >= t.Made)
THEN
@check
ELSE
t.Made
END
FROM @t t
INNER JOIN @c cn ON cn.users=t.users
--Test data
UPDATE @t SET Made=12 WHERE users='us1'
UPDATE @t SET Made=10 WHERE users='us2'
UPDATE @t SET Made=5 WHERE users='us3'
--Check result
SELECT * FROM @t
--add to distribution new users
INSERT INTO @t (users, limit, Made) values ('us4',0,0)
INSERT INTO @t (users, limit, Made) values ('us5',0,0)
--Clear table
DELETE FROM @c
--Check new data
insert into @c
select
*,
COUNT(*) OVER () as Cnt,
ROW_NUMBER() OVER (ORDER BY users) as Rn
from
@t
--Distribution
update t
set @check = (@orderCount/Cnt) + CASE WHEN @orderCount % Cnt >= Rn THEN 1 ELSE 0 END,
limit=
CASE WHEN
(@check >= t.Made)
THEN
@check
ELSE
t.Made
END
FROM @t t
INNER JOIN @c cn ON cn.users=t.users
--Check result
SELECT * FROM @t
它为用户划分订单数量。1 个用户的 50/3 ~16 个订单。如果我添加 2 个新用户,那么 50/5 ~ 10。但是 1 个用户执行 12 个订单。还有 12 个新的分销订单 (10)。然后他过去进入第 12 列限制。而 50-12=38。然后 38/4 ~ 9 订单其余用户。
解决方案
SELECT x.users,
x.work,
x.Made,
sum(CASE WHEN Made>NewLimit THEN Made ELSE 0 END) OVER() as Dif,
count(CASE WHEN Made<NewLimit THEN NewLimit END) OVER() as Cnt,
CASE WHEN Made>NewLimit THEN 0 ELSE 1 END as IsUsed,
(CASE WHEN Made<NewLimit THEN
ROW_NUMBER() OVER (PARTITION BY x.work, (case when Made<NewLimit then 1 else 0 end) ORDER BY work) ELSE 0 END) as Rn
FROM (
SELECT t.users ,(@orderCount/Cnt) + CASE WHEN @orderCount % Cnt >= Rn THEN 1 ELSE 0 END as NewLimit,
t.Made,
t.work
FROM @t t
INNER JOIN @c cn ON cn.users=t.users
) x
我考虑旧分布更多的数量。我正在为新发行版设置 isUsed 标志。我考虑数字。我从所有订单中扣除新莱姆石习惯的数量,然后将收到的数量除以适合新分配的数量。
推荐阅读
- php - Ajax 请求不执行(完全是幽灵)
- angular - 在组件的方法中创建的对象的 TypeScript 测试属性
- sql - SQL 无法将 Varchar 转换为数值 - 转换失败错误
- php - 来自 laravel api 的外部 phpmyadmin
- javascript - 在映射的箭头函数中作为参数传递的对象中的键值分配
- android - 如果用户2手机的屏幕使用推送关闭,如何向用户1发送XMPP消息确认(双勾)?
- .net - dotnet 发布“无法加载源 https://api.nuget.org/v3/index.json 的服务索引”
- c - 从 Buff 加载文件
- docker - Eureka-client 无法调用另一个 Eureka-client,抛出 UnknownHostException
- python - 作为 Python 程序的一部分运行 OpenCV 脚本