在 MySQL 中获取多个用户的最后 2 行

Fetching last 2 rows of multiple user in MySQL

我有一个 table 来列出用户进行的交易。

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.0,你可以使用 window 函数:

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

如果给定客户在同一日期可能有多个交易,可以考虑在window函数的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