首页 > 解决方案 > 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 值。

标签: mysqlsql

解决方案


这适用于所有版本的 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

推荐阅读