1491. 去掉最低工资和最高工资后的工资平均值

给你一个整数数组 salary ,数组里每个数都是 唯一 的,其中 salary[i] 是第 i 个员工的工资。

请你返回去掉最低工资和最高工资以后,剩下员工工资的平均值。

示例 1:

输入:salary = [4000,3000,1000,2000]
输出:2500.00000
解释:最低工资和最高工资分别是 1000 和 4000 。
去掉最低工资和最高工资以后的平均工资是 (2000+3000)/2= 2500
示例 2:

输入:salary = [1000,2000,3000]
输出:2000.00000
解释:最低工资和最高工资分别是 1000 和 3000 。
去掉最低工资和最高工资以后的平均工资是 (2000)/1= 2000
示例 3:

输入:salary = [6000,5000,4000,3000,2000,1000]
输出:3500.00000
示例 4:

输入:salary = [8000,9000,2000,3000,6000,1000]
输出:4750.00000
double average(int* salary, int salarySize){
    int max = salary[0], min = salary[0], i;
    double sum = 0;
    double ret;

    for (i = 0;i < salarySize; i++) {
        sum += salary[i];
        if (salary[i] > max) {
            max = salary[i];
        } else if (salary[i] < min){
            min = salary[i];
        }
    }
    
    ret = (sum - max - min) / (salarySize - 2);

    return ret;
}
### 计算指定时间范围内的平均值 为了在 SQL 中计算特定时间段内的平均值,通常需要结合 `WHERE` 子句来限定日期条件,并使用聚合函数 `AVG()` 来计算均值。如果涉及到更复杂的场景,比如按部门或其他分类统计,则可能还需要配合 `GROUP BY` 或者窗口函数。 对于给定的时间段过滤,假设有一个包含员工工资记录的表格 `salary_records`,其中有字段 `emp_num`, `dep_num`(部门编号), `pay_date` (支付日期),以及 `amount` 表示金额。要获取某段时间内各部门薪资总额的平均数,可以采用如下方法: #### 方法一:简单查询加 WHERE 过滤 当不需要考虑排名等因素时,可以直接通过简单的 `SELECT ... FROM ... WHERE ... GROUP BY ... AVG(...)` 结构实现目标。下面的例子展示了如何取得2023年第一季度(即1月至3月)各部们的平均薪水[^1]。 ```sql SELECT dep_num, CAST(AVG(amount) AS DECIMAL(18, 2)) AS avg_amount -- 使用CAST转换精度并保留两位小数 FROM salary_records sr WHERE pay_date >= '2023-01-01' AND pay_date < '2023-04-01' GROUP BY dep_num; ``` 此语句会返回每个部门在这三个月期间发放的所有薪水中位数的结果集。 #### 方法二:应用窗口函数细化分析 若希望进一步深入研究,例如排除最高最低薪酬的影响或者基于百分比排名筛选有效样本点再做平均运算,那么就可以引入窗口函数来进行更加精细的操作[^3]。 这里给出一个例子,它先根据部门划分数据集并对每组内部按照薪资升序排列得到相对位置信息;接着去除掉处于极端两端的部分观测值之后才开始汇总求取剩余部分的平均值。 ```sql WITH ranked_salaries AS ( SELECT dep_num, amount, PERCENT_RANK() OVER (PARTITION BY dep_num ORDER BY amount ASC) as prnk FROM salary_records sr WHERE pay_date BETWEEN '2023-01-01' AND '2023-03-31' ) SELECT dep_num, CAST(AVG(amount) AS DECIMAL(18, 2)) AS adjusted_avg_salary FROM ranked_salaries rs WHERE prnk NOT IN (0, 1) -- 排除最大最小值影响 GROUP BY dep_num; ``` 上述代码片段实现了对原始数据集中异常高或低数值的有效剔除,从而使得最终得出的平均值更能反映实际情况。 #### 处理跨年度或多个月份的情况 如果有需求提取跨越多个自然年的连续月份的数据,或者是想要确保即使某些月中没有任何交易也能显示出来的话,就需要额外创建辅助表或者其他手段生成完整的月份序列作为参照框架[^2]。 例如,可以通过构建临时表的方式预先准备好所需的时间维度列表,然后再与其他业务逻辑相结合完成整个查询过程。 ```sql -- 创建一个包含所有整月的第一天日期的CTE表达式 WITH RECURSIVE month_list AS ( SELECT DATE('2022-01-01') AS first_day_of_month UNION ALL SELECT DATE_ADD(first_day_of_month, INTERVAL 1 MONTH) FROM month_list ml WHERE first_day_of_month < '2023-01-01' ), filtered_data AS ( /* 此处放置实际业务逻辑 */ ) /* 后续操作... */ ``` 这种方法能够很好地应对那些存在缺失月份但仍需展现完整周期报表的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值