如何使用SQL查询每月最后一天对应的每日数据?
需求说明
现有一张记录每日数据的表格,包含跨月的每日记录,输入数据示例如下:
| Date | Value |
|---|---|
| 01-01-2023 | 45 |
| 02-01-2023 | 282 |
| ........ | ...... |
| 31-01-2023 | 887 |
期望检索出每月最后一天对应的数据,输出示例如下:
| Date | Value |
|---|---|
| 31-01-2023 | 887 |
实现方案
以下针对不同主流数据库提供对应的SQL语句,假设你的表名为daily_data,日期字段为Date,数值字段为Value。
MySQL/MariaDB
使用LAST_DAY()函数直接匹配当月最后一天的记录:
SELECT Date, Value FROM daily_data WHERE Date = LAST_DAY(Date);
PostgreSQL
通过DATE_TRUNC()结合时间间隔计算当月最后一天:
SELECT Date, Value FROM daily_data WHERE Date = (DATE_TRUNC('month', Date) + INTERVAL '1 month - 1 day')::DATE;
SQL Server
使用EOMONTH()函数获取当月最后一天并筛选:
SELECT Date, Value FROM daily_data WHERE Date = EOMONTH(Date);
Oracle
用LAST_DAY()函数匹配目标记录:
SELECT Date, Value FROM daily_data WHERE Date = LAST_DAY(Date);
跨数据库兼容写法
如果需要适配多数数据库,可通过分组获取每月最大日期来关联筛选:
SELECT d.Date, d.Value FROM daily_data d INNER JOIN ( SELECT TO_CHAR(Date, 'YYYY-MM') AS month_key, MAX(Date) AS last_day FROM daily_data GROUP BY month_key ) m ON d.Date = m.last_day;
注:TO_CHAR为PostgreSQL/Oracle的日期格式化函数,MySQL替换为DATE_FORMAT(Date, '%Y-%m'),SQL Server替换为FORMAT(Date, 'yyyy-MM')即可。
内容的提问来源于stack exchange,提问作者pc_pyr
相关产品推荐
相关产品推荐

