본문 바로가기
Data Analysis/Query

리트코드 : 1587. Bank Account Summary II

by 베짱이28호 2024. 8. 31.

리트코드 : 1587. Bank Account Summary II


문제

Table: Users

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| account      | int     |
| name         | varchar |
+--------------+---------+
account is the primary key (column with unique values) for this table.
Each row of this table contains the account number of each user in the bank.
There will be no two users having the same name in the table.


Table: Transactions

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| trans_id      | int     |
| account       | int     |
| amount        | int     |
| transacted_on | date    |
+---------------+---------+
trans_id is the primary key (column with unique values) for this table.
Each row of this table contains all changes made to all accounts.
amount is positive if the user received money and negative if they transferred money.
All accounts start with a balance of 0.


Write a solution to report the name and balance of users with a balance higher than 10000. The balance of an account is equal to the sum of the amounts of all transactions involving that account.

Return the result table in any order.

The result format is in the following example.



Example 1:

Input: 
Users table:
+------------+--------------+
| account    | name         |
+------------+--------------+
| 900001     | Alice        |
| 900002     | Bob          |
| 900003     | Charlie      |
+------------+--------------+
Transactions table:
+------------+------------+------------+---------------+
| trans_id   | account    | amount     | transacted_on |
+------------+------------+------------+---------------+
| 1          | 900001     | 7000       |  2020-08-01   |
| 2          | 900001     | 7000       |  2020-09-01   |
| 3          | 900001     | -3000      |  2020-09-02   |
| 4          | 900002     | 1000       |  2020-09-12   |
| 5          | 900003     | 6000       |  2020-08-07   |
| 6          | 900003     | 6000       |  2020-09-07   |
| 7          | 900003     | -4000      |  2020-09-11   |
+------------+------------+------------+---------------+
Output: 
+------------+------------+
| name       | balance    |
+------------+------------+
| Alice      | 11000      |
+------------+------------+
Explanation: 
Alice's balance is (7000 + 7000 - 3000) = 11000.
Bob's balance is 1000.
Charlie's balance is (6000 + 6000 - 4000) = 8000.
  • 통장정리 후, 정리한 기록이 10000보다 큰 사람과 금액 출력

문제 풀이

MySQL

SELECT u.name, SUM(amount) as balance
FROM users u
JOIN transactions t on u.account = t.account
GROUP BY t.account
HAVING SUM(amount) > 10000
  • account로 JOIN 후, GROUP BY + HAVING으로 출력해주기.

Pandas

import pandas as pd

def account_summary(users: pd.DataFrame, transactions: pd.DataFrame) -> pd.DataFrame:
    joined = pd.merge(users, transactions, on='account')
    grouped = joined.groupby(['account','name']).agg(
        balance = ('amount','sum')
    ).reset_index()
    return grouped[grouped['balance']>10000][['name','balance']]
  • 마찬가지로 merge 이후, account, named으로 group by (account로만 묶으면 name 없어져서)
  • 이후에 조건 걸어줘서 출력

코멘트

  • 쉽다

댓글