跳至主要內容

1873. 计算特殊奖金


1873. 计算特殊奖金

🟢   🔖  数据库  🔗 力扣open in new window LeetCodeopen in new window

题目

Table: Employees

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| employee_id | int     |
| name        | varchar |
| salary      | int     |
+-------------+---------+

employee_id is the primary key (column with unique values) for this table.

Each row of this table indicates the employee ID, employee name, and salary.

Write a solution to calculate the bonus of each employee. The bonus of an employee is 100% of their salary if the ID of the employee is an odd number and **the employee 's name does not start with the character **'M'. The bonus of an employee is 0 otherwise.

Return the result table ordered by employee_id.

The result format is in the following example.

Example 1:

Input:

Employees table:

+-------------+---------+--------+
| employee_id | name    | salary |
+-------------+---------+--------+
| 2           | Meir    | 3000   |
| 3           | Michael | 3800   |
| 7           | Addilyn | 7400   |
| 8           | Juan    | 6100   |
| 9           | Kannon  | 7700   |
+-------------+---------+--------+

Output:

+-------------+-------+
| employee_id | bonus |
+-------------+-------+
| 2           | 0     |
| 3           | 0     |
| 7           | 7400  |
| 8           | 0     |
| 9           | 7700  |
+-------------+-------+

Explanation:

The employees with IDs 2 and 8 get 0 bonus because they have an even employee_id.

The employee with ID 3 gets 0 bonus because their name starts with 'M'.

The rest of the employees get a 100% bonus.

题目大意

表: Employees

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| employee_id | int     |
| name        | varchar |
| salary      | int     |
+-------------+---------+

employee_id 是这个表的主键(具有唯一值的列)。

此表的每一行给出了雇员 id ,名字和薪水。

编写解决方案,计算每个雇员的奖金。如果一个雇员的 id 是 奇数 并且他的名字不是以 'M' 开头 ,那么他的奖金是他工资的 100% ,否则奖金为 0

返回的结果按照 employee_id 排序。

返回结果格式如下面的例子所示。

示例 1:

输入:

Employees 表:

+-------------+---------+--------+
| employee_id | name    | salary |
+-------------+---------+--------+
| 2           | Meir    | 3000   |
| 3           | Michael | 3800   |
| 7           | Addilyn | 7400   |
| 8           | Juan    | 6100   |
| 9           | Kannon  | 7700   |
+-------------+---------+--------+

输出:

+-------------+-------+
| employee_id | bonus |
+-------------+-------+
| 2           | 0     |
| 3           | 0     |
| 7           | 7400  |
| 8           | 0     |
| 9           | 7700  |
+-------------+-------+

解释:

因为雇员 id 是偶数,所以雇员 id 是 2 和 8 的两个雇员得到的奖金是 0。

雇员 id 为 3 的因为他的名字以'M'开头,所以,奖金是 0。

其他的雇员得到了百分之百的奖金。

解题思路

MySQL

  1. 返回字段
    使用 SELECT 指定返回字段:

    • employee_id:雇员 ID。
    • 计算奖金并命名为 bonus
  2. 奖金计算逻辑
    使用 CASE 表达式计算奖金:

    • 如果雇员 ID 是奇数 (employee_id % 2 = 1) 且名字不是以 'M' 开头 (name NOT LIKE 'M%'),则奖金等于工资(salary)。
    • 否则奖金为 0
  3. 排序要求
    employee_id 进行升序排序。

复杂度分析

  • 时间复杂度O(n),假设表中有 n 条记录,需要对所有记录应用条件筛选和奖金计算。
  • 空间复杂度:SQL 查询本身不占用额外空间,返回的结果占用的空间与记录数成正比。

Pandas

  1. 加载数据
    Employees 表加载到 Pandas 的 DataFrame 中。

  2. 奖金计算逻辑
    使用 Pandas 的布尔索引和条件判断:

    • 如果 employee_id 是奇数且 name 列的值不以 'M' 开头,则奖金等于对应的 salary 值。
    • 否则奖金为 0
  3. 结果选择与排序
    返回结果包含 employee_id 和计算后的 bonus,按 employee_id 升序排列。

代码

MySQL
SELECT employee_id,
       CASE
           WHEN employee_id % 2 = 1 AND name NOT LIKE 'M%' THEN salary
           ELSE 0
       END AS bonus
FROM Employees
ORDER BY employee_id;