Mysql 从历史记录表中查询项目

Mysql 从历史记录表中查询项目,mysql,sql,database,subquery,greatest-n-per-group,Mysql,Sql,Database,Subquery,Greatest N Per Group,我有一个“图书馆”历史记录表(类似Excel)来查看一本书的位置 身份证件 日期 书 行动 客户 1. 2020-12-01 1. 托克特 1. 2. 2020-12-02 1. 返回 1. 3. 2020-12-03 1. 托克特 2. 4. 2020-12-04 2. 托克特 2. 5. 2020-12-05 3. 托克特 1. 6. 2020-12-06 3. 返回 1. 7. 2020-12-07 2. 返回 2. 8. 2020-12-08 2. 托克特 1. 要列出当前已售完的书籍,

我有一个“图书馆”历史记录表(类似Excel)来查看一本书的位置

身份证件 日期 书 行动 客户 1. 2020-12-01 1. 托克特 1. 2. 2020-12-02 1. 返回 1. 3. 2020-12-03 1. 托克特 2. 4. 2020-12-04 2. 托克特 2. 5. 2020-12-05 3. 托克特 1. 6. 2020-12-06 3. 返回 1. 7. 2020-12-07 2. 返回 2. 8. 2020-12-08 2. 托克特 1.
要列出当前已售完的书籍,您可以执行以下操作:

select h.*
from history h
where 
    action = 'toClient' 
    and h.date = (select max(d1.date) from history h1 where h1.book = h.book)
这样做的目的是过滤每本书的最新事件日期。然后,只有当对应的事件是“toClient”时,我们才保留该行

这将返回所有客户端的结果。如果只需要一个客户机,只需在查询的
where
子句中添加一个附加条件:

and client = 2
您还可以使用窗口功能执行此操作:

select *
from (
    select h.*,
        rank() over(partition by book order by date desc) rn
    from history h
) h
where rn = 1 and action = 'toClient' -- and client = 2

非常感谢你的快速回答。它很短,工作方式与预期一致!老实说,我无法理解它,也无法理解为什么它给出了正确的结果。我可能需要阅读一些sql书籍来了解如何查询此类表。哦,对不起!我忘了写
动作
也可以是修订、延长时间或其他什么。如果该操作与“toClient”不同,则查询将不再为我提供客户端。