目录
一、力扣原题链接
二、题目描述
交易表:
Transactions
+----------------+----------+ | Column Name | Type | +----------------+----------+ | transaction_id | int | | day | datetime | | amount | int | +----------------+----------+ transaction_id 是该表具有唯一值的列。 每行包括了该次交易的信息。编写一个解决方案,报告每天交易金额
amount
最大 的交易 ID 。如果一天中有多个这样的交易,返回这些交易的 ID 。返回结果根据
transaction_id
升序排列。返回格式如下示例所示:
示例 1:
输入: 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 | +----------------+--------------------+--------+ 输出: +----------------+ | 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()
函数解决这道题目吗?
三、建表语句
drop table if exists Transactions;
Create table If Not Exists Transactions (transaction_id int, day date, amount int);
Truncate table Transactions;
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');
四、题目分析
1、按照每天分组,交易金额倒序排名
2、筛选排名第1
五、SQL解答
with t1 as (
select
transaction_id, day, amount,
-- 1、按照每天分组,交易金额倒序排名
dense_rank() over (partition by day order by amount desc) dr
from transactions
)
select
transaction_id
from t1
-- 2、筛选排名第1
where dr = 1
order by transaction_id
;
六、最终答案
with t1 as (
select
transaction_id, day, amount,
-- 1、按照每天分组,交易金额倒序排名
dense_rank() over (partition by day order by amount desc) dr
from transactions
)
select
transaction_id
from t1
-- 2、筛选排名第1
where dr = 1
order by transaction_id
;