在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中获取多个ID相关值[重复]

MYSQL通过多个用户ID选择消息线程ID [重复]

MySQL和PHP:如何在包含ID的数组中获取多个ID [重复]

MYSQL - 将具有多个重复值的行组合起来,然后删除重复项

MySQL在一个查询中应用多个条件[重复]

每个父级的多个连接和最后 N 行