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:如何查询上次事务日志备份的时间?

Sql Server——查询

SQL Server - VIEWS - 跟踪上次更改时间和更改时间的用户

SQL Server 2008 查询将表数据从一个移动到另一个

sqlserver 如何查询出新增表数据的时间

SQL SERVER获取索引脚本