首页 > 解决方案 > 从历史表中查询项目

问题描述

我有一个“图书馆”历史表(类似 Excel)来查看一本书在哪里或现在在哪里。

ID 日期 行动 客户
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

我试图找出客户 2 有多少书和哪些书(例如)。

我有类似的东西可以找到关于客户 2 的书籍的所有信息:

SELECT * FROM history WHERE book IN 
  (SELECT book FROM history WHERE action='toClient' AND client=2 GROUP BY book)

但是,我也得到了客户端 2 上不再有的书籍。

有没有一种简单的方法来查询最后一个操作是“toClient”而不是“returned”并且当前客户端是客户端 2 的项目?

编辑:忘了写也action可以revisiontimeExtension或其他。

标签: mysqlsqldatabasesubquerygreatest-n-per-group

解决方案


要列出当前已售出的书籍,您可以执行以下操作:

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

推荐阅读