返回介绍

solution / 1800-1899 / 1831.Maximum Transaction Each Day / README

发布于 2024-06-17 01:03:14 字数 2267 浏览 0 评论 0 收藏 0

1831. 每天的最大交易

English Version

题目描述

表: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() 函数解决这道题目吗?

解法

方法一:窗口函数

我们可以使用窗口函数 RANK,按照每天的交易金额 amount 降序排列,然后选择排名为 $1$ 的交易。

# Write your MySQL query statement below
WITH
  T AS (
    SELECT
      transaction_id,
      RANK() OVER (
        PARTITION BY DAY(day)
        ORDER BY amount DESC
      ) AS rk
    FROM Transactions
  )
SELECT transaction_id
FROM T
WHERE rk = 1
ORDER BY 1;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文