在MySQL中获取多个用户的最后2行[重复]
Posted
技术标签:
【中文标题】在MySQL中获取多个用户的最后2行[重复]【英文标题】:Fetching last 2 rows of multiple user in MySQL [duplicate] 【发布时间】:2021-02-08 20:33:24 【问题描述】:我有一张表格来列出用户进行的交易。
mysql> select * from transaction;
+-----------+----------+------------+
| emp_id_fk | trans_id | trans_date |
+-----------+----------+------------+
| 1 | 1 | 2008-01-01 |
| 1 | 2 | 2019-01-01 |
| 1 | 3 | 2020-01-01 |
| 2 | 4 | 2020-01-10 |
| 2 | 5 | 2020-01-16 |
| 2 | 6 | 2020-01-15 |
+-----------+----------+------------+
6 rows in set (0.00 sec)
我想知道用户最近进行的 2 笔交易及其交易 ID。 输出应如下所示。
+-----------+----------+------------+
| emp_id_fk | trans_id | trans_date |
+-----------+----------+------------+
| 1 | 2 | 2019-01-01 |
| 1 | 3 | 2020-01-01 |
| 2 | 5 | 2020-01-16 |
| 2 | 6 | 2020-01-15 |
+-----------+----------+------------+
我尝试过内部连接和 group by 子句,但没有用。如何生成此输出?
【问题讨论】:
如果你在 mysql 8 或更高版本上,如果不是***.com/questions/32716152/…则使用窗口函数@ 【参考方案1】:如果你运行的是 MySQL 8.0,你可以使用窗口函数:
select *
from (
select t.*, row_number() over(partition by emp_id_fk order by trans_date desc) rn
from transactions t
) t
where rn <= 2
order by emp_id_fk, trans_date
如果给定客户在同一日期可能有多个交易,请考虑在窗口函数的order by
子句中添加另一个排序条件,例如trans_id
:
row_number() over(partition by emp_id_fk order by trans_date desc, , trans_id) rn desc
在旧版本中,您可以使用相关子查询:
select t.*
from transactionts t
where (
select count(*)
from transactions t1
where t1.trans_date >= t.trans_date and t1.emp_id_fk = t.emp_id_fk
) <= 2
【讨论】:
先生,这个功能有什么作用row_number()
??
@KUMAR:这是一个排名函数。见dev.mysql.com/doc/refman/8.0/en/…。以上是关于在MySQL中获取多个用户的最后2行[重复]的主要内容,如果未能解决你的问题,请参考以下文章
MySQL和PHP:如何在包含ID的数组中获取多个ID [重复]