sql server查询上次移动的项

4szc88ey  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(268)

我们的存储系统已经满了。我正在尝试识别存储系统中当前处于“非活动”状态(很久没有移动)的项。有了这个,我将有一个简单的方法来确定哪些项目我可以从系统中删除,以释放这些活动项目的位置。我想要一个查询,将显示我的每个项目的最后一次移动的日期(每个唯一的项目一个结果)。这有道理吗?
我有两个表,需要使用item\u 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

当前\u项目\u位置:

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

有什么办法可以做到这一点吗?

1szpjjfi

1szpjjfi1#

如果我跟对了,你想知道最新的动向吗 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) .
我看不出这张table有什么用 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

相关问题