mysql - 从历史表中查询项目
问题描述
我有一个“图书馆”历史表(类似 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
可以revision
,timeExtension
或其他。
解决方案
要列出当前已售出的书籍,您可以执行以下操作:
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
推荐阅读
- python - Python 增强红色
- python - “解析时出现意外的 EOF”
- c# - 有没有办法让 dll 不在构建文件中显示,但仍在 ac# 控制台应用程序中使用?
- java - 如何在 Swagger UI (OpenAPI) 上重新排序端点?
- html - 导航栏上的div溢出
- javascript - React 和 Redux:如何在另一个 Reducer 中访问一个 Reducer 的另一个状态
- android - 如何确定哪个依赖项决定了其他库的版本?
- sql - SQL Query 将不同的行数据返回到一行中
- python - 从字面上开始从免费资源中学习编码,并且已经在 python 3 的初学者级别遇到了问题
- python-3.x - 模块相关问题 - 日历模块