{x}
blog image

Bank Account Summary

Solution Explanation

This problem requires querying two tables, Users and Transactions, to calculate the final credit for each user and determine if they've breached their credit limit. The solution uses SQL.

Approach

The core idea is to consolidate all transactions affecting each user's credit into a single table. Then, we group by user_id to sum up all transactions and the initial credit. Finally, we check if the resulting credit is below zero to determine if the credit limit has been breached.

MySQL Code Explained

SELECT
    t.user_id,
    user_name,
    SUM(t.credit) AS credit,
    IF(SUM(t.credit) < 0, 'Yes', 'No') AS credit_limit_breached
FROM
    (
        SELECT paid_by AS user_id, -amount AS credit FROM Transactions
        UNION ALL
        SELECT paid_to AS user_id, amount AS credit FROM Transactions
        UNION ALL
        SELECT user_id, credit FROM Users
    ) AS t
    JOIN Users AS u ON t.user_id = u.user_id
GROUP BY t.user_id;
  1. Inner SELECT Statement (Subquery t): This subquery unites three sources of credit information:

    • SELECT paid_by AS user_id, -amount AS credit FROM Transactions: This selects the paid_by user id and negates the amount because this user is paying money, thus reducing their credit.
    • UNION ALL : combines the results of the queries.
    • SELECT paid_to AS user_id, amount AS credit FROM Transactions: This selects the paid_to user id and the amount since this user is receiving money, increasing their credit.
    • UNION ALL: Combines results.
    • SELECT user_id, credit FROM Users: This adds the initial credit of each user from the Users table.
  2. JOIN Operation: A JOIN operation combines the results of the subquery t with the Users table using user_id as the join key. This ensures we have access to the user_name for the output.

  3. GROUP BY Clause: This groups the rows by user_id so that SUM(t.credit) calculates the total credit for each user, including initial credit and all transactions.

  4. IF Function: The IF function checks if the sum of credit is less than 0. If true, it returns 'Yes' for credit_limit_breached; otherwise, it returns 'No'.

  5. Output: The query returns user_id, user_name, the calculated credit, and whether the credit_limit_breached

Time Complexity Analysis

The time complexity of this SQL query is dominated by the GROUP BY operation. In the worst case, the number of groups (unique user_ids) is proportional to the number of rows in the Users table (let's call it n). The summation within each group has a time complexity linear to the number of transactions related to that user. If we assume the average number of transactions per user is constant, the overall time complexity can be considered O(n), where n is the number of users. The JOIN operation also has a time complexity that depends on the implementation and indexing but is generally considered efficient for indexed tables.

The space complexity is determined by the size of the intermediate result set generated by the UNION ALL and the GROUP BY operations, which in the worst case, is proportional to the total number of rows in the Transactions table plus the number of rows in the Users table. Therefore, space complexity is O(m + n), where 'm' is the number of transactions and 'n' is the number of users.