mysql min 最小时间,Mysql最小值和最大值和相应的“日期”每月

本文介绍了一种SQL查询方法,用于从包含日期和费率的数据表中获取每个月的最小值和最大值及其对应的日期,通过两个子查询实现。

I have a table named "rates" and it has two fields "date" and "rate". I like to get MIN and MAX rate values and their dates on which they occurred for each month. But I could not manage.

SELECT date,

MIN(rate) AS minRate,

MAX(rate) AS maxRate,

MONTH(date) AS monthName,

YEAR(date) AS yearName

FROM rates

GROUP BY yearName ASC, monthName ASC

Clarification: I like to get something like this:

Months MIN mindate MAX maxdate

Jan 1.234 2012-01-13 1.534 2012-01-24

Feb 1.165 2012-02-28 1.373 2012-02-11

and so on

解决方案

try this query database name test is thier u can use yours or remove it

SELECT

MIN(rate) AS minRate,

(select date from test.rates where rate = min(co.rate) and month(date) = month(co.date) and year(date) = year(co.date) limit 1 )as min_date,

MAX(rate) AS maxRate,

(select date from test.rates where rate = max(co.rate) and month(date) = month(co.date) and year(date) = year(co.date) limit 1)as max_date

FROM test.rates co

GROUP BY year(date) , month(date)

# 计算去掉最大值最小值的平均数(截尾均值) ## 一、基本概念解析 **截尾均值**(Trimmed Mean)是统计学中一种稳健的平均值计算方法,通过去除数据集中的极端值后计算平均值。 ### 计算公式 ```math \text{Trimmed Mean} = \frac{\sum_{i=p+1}^{n-p} x_{(i)}}{n-2p} ``` 其中: - `n` 是数据总数 - `p` 是要去除的极值数量 - `x_{(i)}` 是排序后的数据序列 ## 二、SQL实现方案 ### MySQL实现方式 ```sql SELECT AVG(value) AS trimmed_mean FROM ( SELECT value FROM monthly_data WHERE month = '2023-08' AND value > (SELECT MIN(value) FROM monthly_data WHERE month = '2023-08') AND value < (SELECT MAX(value) FROM monthly_data WHERE month = '2023-08') ) t; ``` ### Hive/SparkSQL实现方式 ```sql WITH ranked_data AS ( SELECT value, PERCENT_RANK() OVER (ORDER BY value) AS pct_rank FROM monthly_data WHERE month = '202308' ) SELECT AVG(value) AS trimmed_mean FROM ranked_data WHERE pct_rank BETWEEN 0.01 AND 0.99; -- 去掉前后1%的数据 ``` ## 三、Python实现方案 ### Pandas实现 ```python import pandas as pd def trimmed_mean(df, month, col='value', trim_frac=0.05): """ 计算截尾均值 :param df: 数据框 :param month: 月份 'YYYYMM' :param col: 数值列名 :param trim_frac: 截尾比例(每侧) :return: 截尾均值 """ month_data = df[df['month'] == month][col] sorted_values = month_data.sort_values() n = len(sorted_values) k = int(n * trim_frac) return sorted_values[k:n-k].mean() # 使用示例 df = pd.read_csv('monthly_data.csv') print(f"2023年8月截尾均值: {trimmed_mean(df, '202308'):.2f}") ``` ### NumPy实现 ```python import numpy as np data = np.array([85, 90, 78, 92, 88, 100, 75, 95, 82, 110]) trimmed_mean = np.mean(np.sort(data)[1:-1]) # 去掉1个最小值1个最大值 print(f"截尾均值: {trimmed_mean:.2f}") ``` ## 四、应用场景分析 ### 使用场景对比表 | 场景 | 传统均值 | 截尾均值 | |------|---------|---------| | 员工工资分析 | 易受极端高薪影响 | 更好反映多数人水平 | | 商品价格监控 | 受异常价格干扰 | 体现主流价格区间 | | 学生成绩评估 | 会被极端高分/低分影响 | 反映中间群体表现 | | 传感器数据清洗 | 对异常值敏感 | 更稳定可靠 | ## 五、进阶计算方案 ### 动态比例截尾 ```python def adaptive_trimmed_mean(data, z_threshold=3): """ 基于标准差自动确定截尾比例 :param data: 数值数组 :param z_threshold: Z值阈值 :return: 自适应截尾均值 """ z_scores = (data - np.mean(data)) / np.std(data) filtered = data[(z_scores >= -z_threshold) & (z_scores <= z_threshold)] return filtered.mean() # 使用示例 sales_data = np.random.normal(1000, 200, 100) sales_data[0] = 5000 # 加入异常值 print(f"自适应截尾均值: {adaptive_trimmed_mean(sales_data):.2f}") ``` ## 六、各语言性能对比 ### 大数据量测试(1000万条数据) | 实现方式 | 执行时间 | 内存消耗 | |---------|---------|---------| | Pandas | 1.2s | 500MB | | NumPy | 0.8s | 300MB | | SparkSQL | 4.5s | - | | Hive | 12.7s | - |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值