我们的存储系统已满。我正在尝试识别存储系统中当前处于“非事件”状态(很长时间没有移动)的项目。有了这个,我将有一个简单的方法来识别哪些项目可以从系统中删除,以便为事件项目释放这些位置。我想要一个查询,该查询将显示每个项目的最后一次移动的日期(每个唯一项目一个结果)。这有道理吗?
我有 2 个表,需要使用 item_id 连接。
运动日志:
item_id time operation container quantity
A 2020-01-01 11:00:00.000 Load 1 90
B 2020-01-01 13:00:00.000 Load 2 30
C 2020-01-02 09:00:00.000 Load 3 10
D 2020-01-03 15:00:00.000 Load 4 7
E 2020-01-03 15:30:00.000 Load 6 220
A 2020-01-03 16:00:00.000 Load 5 20
B 2020-01-03 17:00:00.000 Unload 2 10
C 2020-01-04 09:00:00.000 Load 3 5
D 2020-01-05 11:00:00.000 Unload 4 2
D 2020-01-06 11:00:00.000 Unload 4 2
B 2020-01-06 12:00:00.000 Unload 2 10
A 2020-01-06 13:00:00.000 Unload 1 10
E 2020-01-06 14:00:00.000 Unload 6 220
当前项目位置:
item_id container quantity
A 1 80
B 2 10
C 3 15
D 4 3
A 5 20
C 3 15
查询结果:
item_id last_movement last_operation
C 2020-01-04 09:00:00.000 Load
D 2020-01-06 11:00:00.000 Unload
B 2020-01-06 12:00:00.000 Unload
A 2020-01-06 13:00:00.000 Unload
关于如何实现这一目标有什么想法吗?
最佳答案
如果我没听错的话,您需要每个 item_id
的最新动态。如果是这样,一种选择是使用子查询进行过滤:
select m.item_id, m.time as last_movement, m.operation as last_operation
from movement_log m
where m.time = (select max(m1.time) from movement_log m1 where m1.item_id = m.item_id)
order by last_movement
此查询将利用 movement_log(item_id, time)
上的索引。
我在这里没有看到表 current_item_positions
的使用,因为您需要的所有信息都可以在 movement_log
中找到。
另一个选项是row_number()
:
select m.item_id, m.time as last_movement, m.operation as last_operation
from (
select m.*, row_number() over(partition by item_id order by time desc) rn
from movement_log m
) m
where rn = 1
关于SQL Server 查询最后移动的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63018424/