mysql - 按 id 和月份获取最后一个值、倒数第二个值和倒数第三个值

标签 mysql sql

MySQL 工作台 6.3 。我有以下数据集。

id  date        value
36  12/1/2015   3174
36  11/1/2015   3143
36  10/1/2015   3112
36  9/1/2015    3082
36  8/1/2015    3052
36  7/1/2015    3021
36  6/1/2015    2990
64  11/1/2015   3105
64  10/1/2015   3074
64  8/1/2015    3014
64  7/1/2015    2983
64  6/1/2015    2952
65  12/1/2015   3414
72  10/1/2015   3352
72  9/1/2015    3322
72  8/1/2015    3292
72  7/1/2015    3261
72  6/1/2015    3230
72  5/1/2015    3198
72  4/1/2015    3169
72  3/1/2015    3139
72  2/1/2015    3107
72  1/1/2015    3079

我想要获取的是按 id 分组并获取最近 3 个月的值。 (如果原始数据中没有记录,则保留所有日期和值。) 下表是我的手动输出,以显示我想要得到的内容。非常感谢。

id  current_month   value1  1_month_before_current  value2  2_month_before_current  value3  3_month_before_current  value3
36  12/1/2015       3174    11/1/2015               3143    10/1/2015               3112    9/1/2015               3082
64  null            null    11/1/2015               3105    10/1/2015               3074    null                   null
72  null            null    null                    null    10/1/2015               3352    9/1/2015               3322

最佳答案

只需使用条件聚合:

select id,
       max(case when date = '2015-12-01' then date end) as current_month,
       max(case when date = '2015-12-01' then value end) as current_value,
       max(case when date = '2015-11-01' then date end) as prev_month,
       max(case when date = '2015-11-01' then value end) as prev_value,
       max(case when date = '2015-10-01' then date end) as prev2_month,
       max(case when date = '2015-10-01' then value end) as prev2_value,
from t
group by id;

如果您不喜欢输入日期:

select id,
       max(case when date = curmon then date end) as current_month,
       max(case when date = curmon then value end) as current_value,
       max(case when date = curmon - interval 1 month then date end) as prev_month,
       max(case when date = curmon - interval 1 month then value end) as prev_value,
       max(case when date = curmon - interval 2 month then date end) as prev2_month,
       max(case when date = curmon - interval 2 month then value end) as prev2_value,
from t cross join
     (select date('2015-12-01') as curmon) params
group by id;

此外,如果日期不全是当月的第一天,您可以在 case 表达式中使用范围逻辑。

关于mysql - 按 id 和月份获取最后一个值、倒数第二个值和倒数第三个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39627251/

相关文章:

sql - 为什么在使用数据库邮件时出现以下错误 -> 过程 sysmail_verify_profile_sp,配置文件名称无效?

java - 在sql中查找上个月最后一天的数据

mysql - SQL : Calculating Percentage by joining a sub table to another

php - 如何使用 Mysql 数据填充下拉列表的选定值?

mysql - 使用日期对组使用子查询计算索引位置

mysql - 何时在MySQL中使用单引号,双引号和反引号

php - 不能添加两个时间变量

mysql - 在 mysql 中使用 DATE_FORMAT 获取毫秒数

sql - 设置执行 PL/SQL 脚本的最长时间

SQL Server 等效于 Excel 的 TINV 函数