按ModifiedDateTime排序工单事务遇同时间优先级问题求助
问题
我尝试按modifiedDateTime对工单事务排序,当前使用Row_Number()结合分区功能排序,之后仅选择rn = 1的记录。
当前代码:
ROW_NUMBER() OVER ( PARTITION BY [AX].[WHSWorkLine].[WorkId] ORDER BY [AX].[WHSWorkLine].[MODIFIEDDATETIME] DESC ) AS [rn]
遇到的问题:工作人员快速执行'pick'(拣货)和'put'(上架)操作时,两类事务的ModifiedDateTime记录为同一秒。当最新两条事务为同秒的'pick'和'put'类型时,需要优先排序'put'记录。但之前尝试用case表达式按WorkType排序时,会导致所有'put'事务排至顶部,忽略其他类型事务的时间先后。
以下是三种场景的预期排序示例:
场景1:存在其他类型事务
| WorkID | WorkType | ModifiedDateTime | rn |
|---|---|---|---|
| 1 | 其他类型 | 2024-01-01 11:00:00 | 1 |
| 1 | put | 2024-01-01 12:00:00 | 2 |
| 1 | pick | 2024-01-01 12:00:00 | 3 |
场景2:仅同秒的put和pick
| WorkID | WorkType | ModifiedDateTime | rn |
|---|---|---|---|
| 1 | put | 2024-01-01 12:00:00 | 1 |
| 1 | pick | 2024-01-01 12:00:00 | 2 |
场景3:put时间晚于pick
| WorkID | WorkType | ModifiedDateTime | rn |
|---|---|---|---|
| 1 | pick | 2024-01-01 11:00:00 | 1 |
| 1 | put | 2024-01-01 12:00:00 | 2 |
解决方案
只需在ORDER BY子句中,先按MODIFIEDDATETIME降序,再添加一个基于WorkType的case表达式作为第二排序条件即可。这样既保证了时间优先的原则,又能在同秒的pick和put事务中让put优先。
修改后的代码:
ROW_NUMBER() OVER ( PARTITION BY [AX].[WHSWorkLine].[WorkId] ORDER BY [AX].[WHSWorkLine].[MODIFIEDDATETIME] DESC, CASE [AX].[WHSWorkLine].[WorkType] WHEN 'put' THEN 1 WHEN 'pick' THEN 2 ELSE 3 END ASC ) AS [rn]
逻辑说明
- 第一排序条件还是
MODIFIEDDATETIME DESC,确保所有事务先按时间从新到旧排序,不会打乱其他类型事务的时间顺序; - 第二排序条件通过case表达式给不同WorkType赋值:put=1,pick=2,其他类型=3,再按升序排列。这样当两条事务时间相同时,put会排在pick前面,其他类型则按原有逻辑处理,不会出现所有put都跳转到顶部的问题。
内容的提问来源于stack exchange,提问作者Danielle Massey
相关产品推荐
相关产品推荐

