SQL需求:基于DATE与DFF列计算每月平均利率
按月份计算平均利率的SQL实现
需求说明
现有数据表(假设表名为interest_rates)包含两列:
DATE:日期类型字段DFF:浮点型的利率数值
需要编写SQL语句,计算每个年份-月份的平均利率。
示例数据
| DATE | DFF |
|---|---|
| 2003-01-04 | 2.0 |
| 2003-01-18 | 2.25 |
| 2003-01-25 | 2.5 |
| 2003-02-08 | 3.0 |
| 2003-02-15 | 3.25 |
| 2003-02-27 | 2.75 |
| 2004-05-07 | 4.0 |
| 2004-05-25 | 4.0 |
期望结果
| date | avg_dff |
|---|---|
| 2003-01 | 2.25 |
| 2003-02 | 3.0 |
| 2004-05 | 4.0 |
不同数据库的SQL实现
由于不同数据库对日期格式化/截断的函数不同,以下是常见数据库的写法:
1. MySQL / MariaDB
用DATE_FORMAT将日期转为YYYY-MM格式,再分组计算平均值:
SELECT DATE_FORMAT(DATE, '%Y-%m') AS date, AVG(DFF) AS avg_dff FROM interest_rates GROUP BY DATE_FORMAT(DATE, '%Y-%m') ORDER BY date;
也可以通过提取年、月分组,效果一致:
SELECT CONCAT(YEAR(DATE), '-', LPAD(MONTH(DATE), 2, '0')) AS date, AVG(DFF) AS avg_dff FROM interest_rates GROUP BY YEAR(DATE), MONTH(DATE) ORDER BY date;
2. PostgreSQL
用DATE_TRUNC截断日期到月份,再转为字符串格式;或者直接用TO_CHAR格式化:
SELECT TO_CHAR(DATE_TRUNC('month', DATE), 'YYYY-MM') AS date, AVG(DFF) AS avg_dff FROM interest_rates GROUP BY DATE_TRUNC('month', DATE) ORDER BY date;
简化版:
SELECT TO_CHAR(DATE, 'YYYY-MM') AS date, AVG(DFF) AS avg_dff FROM interest_rates GROUP BY TO_CHAR(DATE, 'YYYY-MM') ORDER BY date;
3. SQL Server
用FORMAT函数格式化日期,或者组合年、月生成月份标识:
SELECT FORMAT(DATE, 'yyyy-MM') AS date, AVG(DFF) AS avg_dff FROM interest_rates GROUP BY FORMAT(DATE, 'yyyy-MM') ORDER BY date;
如果需要更好的性能,推荐用日期截断后转换:
SELECT CONVERT(VARCHAR(7), DATE, 120) AS date, AVG(DFF) AS avg_dff FROM interest_rates GROUP BY CONVERT(VARCHAR(7), DATE, 120) ORDER BY date;
说明
- 如果需要控制平均利率的小数位数,可以用
ROUND(AVG(DFF), 2)来保留两位小数(根据需求调整位数)。 - 分组时要确保是年份+月份的唯一组合,避免不同年份的同月被合并。
内容的提问来源于stack exchange,提问作者Aurel Sahiti
相关产品推荐
相关产品推荐

