在 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
我有一个 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