这是我之前的问题的修改版本:TSQL equally divide resultset to groups and update them
我的数据库有2个表,如下所示:
订单表具有如下数据:
OrderID OperatorID GroupID OrderDesc Status Cash ...
--------------------------------------------------------------------------
1 1 1 small_order 1 300
2 1 1 another_order 1 0
3 1 2 xxxxxxxxxxx 2 1000
5 2 2 yyyyyyyyyyy 2 150
9 5 1 xxxxxxxxxxx 1 50
10 NULL 2 xxxxxxxxxxx 1 150
11 NULL 3 xxxxxxxxxxx 1 -50
12 4 1 xxxxxxxxxxx 1 200
操作员表:
OperatorID Name GroupID Active
---------------------------------------
1 John 1 1
2 Kate 1 1
4 Jack 2 1
5 Will 1 0
6 Sam 3 0
我可以使用以下查询将记录集平均分为几个组:
SELECT o.*, op.operatorName AS NewOperator, op.operatorID AS NewOperatorId
FROM (SELECT o.*, (ROW_NUMBER() over (ORDER BY newid()) % numoperators) + 1 AS randseqnum
FROM Orders o CROSS JOIN
(SELECT COUNT(*) AS numoperators FROM operators WHERE operators.active=1) op
WHERE o.status in (1,3)
) o JOIN
(SELECT op.*, ROW_NUMBER() over (ORDER BY newid()) AS seqnum
FROM Operators op WHERE op.active=1
) op
ON o.randseqnum = op.seqnum ORDER BY o.orderID
演示位于:http://sqlfiddle.com/#!3/ff47b/1
从上面使用脚本,我可以将Orders划分为(几乎)相等的组,但要基于编号或Operator的Orders,但是我需要对其进行修改,以便它将基于总和或
Cash
的Orders将Operators分配给Orders。例如:
如果我有6个订单的
Cash
值:300、0、50、150,-50、200,则它们的总和为650。我的脚本应为3个操作员分配2个随机订单,每个订单的
Cash
为随机和。我想要得到的是例如将300,-50分配给operator1,200,0分配给第二,而150,50分配给第三。
希望这个声音清晰:)
这是我期望得到的示例输出:
ORDERID OPERATORID GROUPID DESCRIPTION STATUS CASH NEWOPERATORID
------------------------------------------------------------------------
1 1 1 small_order 1 300 2
2 1 1 another_order 1 0 1
9 5 1 xxxxxxxxxxx 1 50 4
10 (null) 2 xxxxxxxxxxx 1 150 4
11 (null) 3 xxxxxxxxxxx 1 -50 2
12 4 1 xxxxxxxxxxx 1 200 1
我如何(如果可以的话)将操作员分配给我的订单,以使总和或
Cash
最接近平均 最佳答案
如果我理解这项权利,可以通过按最大,最小,然后第二大,然后第二最小的顺序对“现金”列进行排序来获得所需的结果,例如:
ROW_NUMBER() over (order by CASE WHEN CashOrder % 2 = 1 then Cash else -Cash END) as splitCash
您在查询中向下方提供CashOrder的位置
ROW_NUMBER() over (ORDER by CASH) as CashOrder
然后,根据此拆分值指定每个运算符,即(对于三个运算符):
splitCash%3 +1
关于sql - TSQL-根据一个字段将行分为几组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12180854/