SQL Server 查询上次移动的项目
Posted
技术标签:
【中文标题】SQL Server 查询上次移动的项目【英文标题】:SQL Server Query Last Moved Item 【发布时间】:2020-11-11 01:32:50 【问题描述】:我们的存储系统已满。我正在尝试识别存储系统中当前处于“非活动”状态的项目(很长时间没有移动)。有了这个,我将有一种简单的方法来确定我可以从系统中删除哪些项目,从而为活动项目释放这些位置。我想要一个查询,它将向我显示每个项目的最后一次移动日期(每个唯一项目一个结果)。这有意义吗?
我有 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
current_item_positions:
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
关于如何实现这一点的任何想法?
【问题讨论】:
【参考方案1】:如果我正确地关注了你,你想要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
【讨论】:
您好 GMB,感谢您的回复,我将尝试使用您提供的内容,但我知道需要涉及 current_item_position 表以过滤掉所有不属于的项目当前在机器中(例如,在原始帖子中的示例表中,查询不应返回 item_id E。 嗨 GMB,通过在 where 子句中添加这一行,我几乎可以得到想要的结果:AND m.item_id IN (select item_id from current_item_positions] ip)
唯一的问题是机器中有一些项目超过 1 个位置,并且我在查询结果中都看到了这两个位置,我需要过滤掉具有 earliest last_movement_time
的重复 item_id以上是关于SQL Server 查询上次移动的项目的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server - VIEWS - 跟踪上次更改时间和更改时间的用户