【问题标题】:Fetching last 2 rows of multiple user in MySQL [duplicate]在MySQL中获取多个用户的最后2行[重复]
【发布时间】: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 sql datetime subquery greatest-n-per-group


【解决方案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

【讨论】:

猜你喜欢
  • 2016-06-16
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
  • 2014-01-09
  • 2014-04-27
  • 2016-10-09
  • 2017-12-17
相关资源
最近更新 更多