Skip to main content
Back to problems
#579
Hard Database

Find cumulative salary of an employee

Database
49.4% acceptance
Mar 31, 2026
248
405

No description available.

Solution

Pandas
Time O(n)
Space O(1)
LeetCode
solution.pandas
# Table: Employee
# 
# +-------------+------+
# | Column Name | Type |
# +-------------+------+
# | id          | int  |
# | month       | int  |
# | salary      | int  |
# +-------------+------+
# (id, month) is the primary key (combination of columns with unique values) for this table.
# Each row in the table indicates the salary of an employee in one month during the year 2020.
# 
#  
# 
# Write a solution to calculate the cumulative salary summary for every employee in a single unified table.
# 
# The cumulative salary summary for an employee can be calculated as follows:
# 
# For each month that the employee worked, sum up the salaries in that month and the previous two months. This is their 3-month sum for that month. If an employee did not work for the company in previous months, their effective salary for those months is 0.
# 
# Do not include the 3-month sum for the most recent month that the employee worked for in the summary.
# 
# Do not include the 3-month sum for any month the employee did not work.
# 
# Return the result table ordered by id in ascending order. In case of a tie, order it by month in descending order.
# 
# The result format is in the following example.
#
# Example 1:
# Input:
# Employee table:
# +----+-------+--------+
# | id | month | salary |
# +----+-------+--------+
# | 1  | 1     | 20     |
# | 2  | 1     | 20     |
# | 1  | 2     | 30     |
# | 2  | 2     | 30     |
# | 3  | 2     | 40     |
# | 1  | 3     | 40     |
# | 3  | 3     | 60     |
# | 1  | 4     | 60     |
# | 3  | 4     | 70     |
# | 1  | 7     | 90     |
# | 1  | 8     | 90     |
# +----+-------+--------+
# Output:
# +----+-------+--------+
# | id | month | Salary |
# +----+-------+--------+
# | 1  | 7     | 90     |
# | 1  | 4     | 130    |
# | 1  | 3     | 90     |
# | 1  | 2     | 50     |
# | 1  | 1     | 20     |
# | 2  | 1     | 20     |
# | 3  | 3     | 100    |
# | 3  | 2     | 40     |
# +----+-------+--------+
# Explanation:
# Employee '1' has five salary records excluding their most recent month '8':
# - 90 for month '7'.
# - 60 for month '4'.
# - 40 for month '3'.
# - 30 for month '2'.
# - 20 for month '1'.
# So the cumulative salary summary for this employee is:
# +----+-------+--------+
# | id | month | salary |
# +----+-------+--------+
# | 1  | 7     | 90     |  (90 + 0 + 0)
# | 1  | 4     | 130    |  (60 + 40 + 30)
# | 1  | 3     | 90     |  (40 + 30 + 20)
# | 1  | 2     | 50     |  (30 + 20 + 0)
# | 1  | 1     | 20     |  (20 + 0 + 0)
# +----+-------+--------+
# Note that the 3-month sum for month '7' is 90 because they did not work during month '6' or month '5'.
# 
# Employee '2' only has one salary record (month '1') excluding their most recent month '2'.
# +----+-------+--------+
# | id | month | salary |
# +----+-------+--------+
# | 2  | 1     | 20     |  (20 + 0 + 0)
# +----+-------+--------+
# 
# Employee '3' has two salary records excluding their most recent month '4':
# - 60 for month '3'.
# - 40 for month '2'.
# So the cumulative salary summary for this employee is:
# +----+-------+--------+
# | id | month | salary |
# +----+-------+--------+
# | 3  | 3     | 100    |  (60 + 40 + 0)
# | 3  | 2     | 40     |  (40 + 0 + 0)
# +----+-------+--------+

import pandas as pd

def cumulative_salary(employee: pd.DataFrame) -> pd.DataFrame:
  # Exclude the most recent month for each employee
  max_months = employee.groupby('id')['month'].transform('max')
  df = employee[employee['month'] < max_months].copy()
  # For each remaining row, sum salary of current month and up to 2 previous months
  results = []
  for _, row in df.iterrows():
    eid, month = row['id'], row['month']
    mask = (employee['id'] == eid) & (employee['month'] <= month) & (employee['month'] >= month - 2)
    results.append({'id': eid, 'month': month, 'Salary': employee.loc[mask, 'salary'].sum()})
  if not results:
    return pd.DataFrame(columns=['id', 'month', 'Salary'])
  result = pd.DataFrame(results)
  return result.sort_values(['id', 'month'], ascending=[True, False])