题目描述
(通过次数3,194 | 提交次数4,132,通过率77.30%)
表: Transactions +----------------+----------+ | Column Name | Type | +----------------+----------+ | transaction_id | int | | day | datetime | | amount | int | +----------------+----------+ transaction_id 是此表的主键。 每行包括了该次交易的信息。 写一条 SQL?返回每天交易金额 amount 最大的交易 ID 。如果某天有多个这样的交易,返回这些交易的 ID 。 返回结果根据 transaction_id升序排列。 查询结果样例如下: Transactions table: +----------------+--------------------+--------+ | transaction_id | day | amount | +----------------+--------------------+--------+ | 8 | 2021-4-3 15:57:28 | 57 | | 9 | 2021-4-28 08:47:25 | 21 | | 1 | 2021-4-29 13:28:30 | 58 | | 5 | 2021-4-28 16:39:59 | 40 | | 6 | 2021-4-29 23:39:28 | 58 | +----------------+--------------------+--------+ Result table: +----------------+ | transaction_id | +----------------+ | 1 | | 5 | | 6 | | 8 | +----------------+ "2021-4-3" --> 有一个 id 是 8 的交易,因此,把它加入结果表。 "2021-4-28" --> 有两个交易,id 是 5 和 9 ,交易 5 的金额是 40 ,而交易 9 的数量是 21 。只需要将交易 5 加入结果表,因为它是当天金额最大的交易。 "2021-4-29" --> 有两个交易,id 是 1 和 6 ,这两个交易的金额都是 58 ,因此需要把它们都写入结果表。 最后,把交易 id 按照升序排列。 进阶:你可以不使用?MAX()?函数解决这道题目吗? 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/maximum-transaction-each-day
//测试数据 Create table If Not Exists Transactions (transaction_id int, day datetime, amount int); insert into Transactions (transaction_id, day, amount) values ('8', '2021-4-3 15:57:28', '57'); insert into Transactions (transaction_id, day, amount) values ('9', '2021-4-28 08:47:25', '21'); insert into Transactions (transaction_id, day, amount) values ('1', '2021-4-29 13:28:30', '58'); insert into Transactions (transaction_id, day, amount) values ('5', '2021-4-28 16:39:59', '40'); insert into Transactions (transaction_id, day, amount) values ('6', '2021-4-29 23:39:28', '58');
解题思路
根据题目要求:取出每天交易金额最大的那些交易。
这是一个分组取最大的场景。在思路上,一般会有两种方法:
**第一种**:使用GROUP BY + MAX;(下面参考SQL中的方法一)
**第二种**:使用窗口函数从大到小排序,然后取排名为1的记录;(下面参考SQL中的方法二)
这两种方法,都面临分组字段的选择问题。
题目要求按天分组,但源表中只有一个datetime时间戳类型的字段,并没有年月日格式的日期字段。
这就需要将datetime类型的字段转换成date类型,从而构造出一个满足题目要求格式的值来。再对这个值进行分组即可。
参考SQL
未特别说明的情况下,参考SQL为基于MySQL8.0实现。
#方法一 select distinct a.transaction_id from Transactions a where (cast(a.day as date),a.amount) in ( select cast(b.day as date), max(b.amount) from Transactions b group by cast(b.day as date) ) order by a.transaction_id; #方法二 select distinct b.transaction_id from ( select a.transaction_id, rank() over(partition by cast(a.day as date) order by a.amount desc) rk from Transactions a )b where b.rk = 1 order by b.transaction_id;
本站所有内容均为原创,本站保留所有权利。仅允许非商业用途的转载,但必须注明来源网站、作者、来源链接!否则,由此造成的一切后果,由转载方承担!
干货分享、技术提升、面试笔试、学习交流,欢迎关注公众号:xuesql。QQ学习交流群:209942678。