SQL Server 查询最后移动的项目

标签 sql sql-server database where-clause greatest-n-per-group

我们的存储系统已满。我正在尝试识别存储系统中当前处于“非事件”状态(很长时间没有移动)的项目。有了这个,我将有一个简单的方法来识别哪些项目可以从系统中删除,以便为事件项目释放这些位置。我想要一个查询,该查询将显示每个项目的最后一次移动的日期(每个唯一项目一个结果)。这有道理吗?

我有 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/

相关文章:

python - Django 查询将参数传递到values()

mysql - 这个 mysql 是否正确转换为 sql server?

sql-server - 合并重复值的行

c# - Entity Framework 事务

iphone - 在 iphone sdk 中以编程方式创建 sqlite 数据库

sql - 缓慢的 Informix COUNT/GROUP BY 查询,即使有适当的索引

mysql - 指针类型与 mysql_store_result 不兼容

javascript - 如何将段落位置移动到底部?

c# - 如何在 C# 中从 SQL Server 数据库中检索数据?

sql - 如何在 MERGE 语句中更新源表?