mysql - Mysql查询返回每个元素的最新结果
问题描述
很难将我的思想围绕似乎应该是一个简单的查询。
因此,假设我们有一个表格,按日期跟踪每个商店中小部件/气球的数量。您如何获得商店列表及其最新的小部件/气球数量?
IE
mysql> SELECT * FROM inventory;
+----+------------+-------+---------+---------+
| id | invDate | store | widgets | balloons|
+----+------------+-------+---------+---------+
| 1 | 2011-01-01 | 3 | 50 | 35 |
| 2 | 2011-01-04 | 2 | 50 | 35 |
| 3 | 2013-07-04 | 3 | 12 | 78 |
| 4 | 2020-07-04 | 2 | 47 | 18 |
| 5 | 2020-08-06 | 2 | 16 | NULL |
+----+------------+-------+---------+---------+
5 rows in set (0.00 sec)
希望结果表列出所有商店及其最新的小部件/气球库存
商店,最新的小部件,最新的气球
+-------+-----------+---------+
| store | widgets | baloons |
+-------+-----------+---------+
| 2 | 16 | NULL |
| 3 | 12 | 78 |
+-------+-----------+---------+
或获取气球的最新非 NULL 值。
解决方案
这适用于所有版本的 MySQL
select i.*
from inventory i
join
(
select store, max(invDate) as maxDate
from inventory
group by store
) tmp on tmp.store = i.store
and tmp.maxDate = i.invDate
使用 MySQL 8+,您可以执行窗口函数:
with cte as
(
select store, widgets, balloons,
ROW_NUMBER() OVER(PARTITION BY store ORDER BY invDate desc) AS rn
from inventory
)
select * from cte where rn = 1
推荐阅读
- php - Redis 中的 FLUSHALL ASYNC 线程是否安全?
- android - android phone linux deploy docker systemctl 在 chroot 中运行,忽略请求。问题
- php - 如何删除数组前后的“”
- ios - 如何在 Swift 4 中显示没有 UIViewController 的新屏幕?
- encryption - 是否所有功能都属于 FAST API 中可用的 Django Rest Framework 来开发 REST APIS
- cron - 在 12:00 AM 到 12:59 AM 之间每 20 分钟执行一次 Cron 表达式,仅在星期六
- backend - 在没有浏览器的情况下运行 DHTMLX API
- c++ - 单击一个按钮后创建一个按钮
- vue.js - 如果在所选语言文件中没有找到翻译,如何显示英文翻译?
- css - 如何使用 CSS 重现设备下的阴影