首页 > 解决方案 > MYSQL - 使用包含假期的日期行查找行增量

问题描述

我有一个表,其中包含一个带有日期的字段(称为日期)和一个带有累积运行总计的字段(称为 X)| 称它为表样本。

***我在 DATE 字段中的数据不包括周末和节假日。

我可以通过简单地减去“X”中的任何选定值并从上面的行中减去它来找到每天的数字增量。

这是我当前的查询:

select
date,
a.X - b.X as 'Daily Total'

from SAMPLE as a 
left join SAMPLE as b
on b.date = if(weekday(a.date) = 0 , a.date - interval 3 day, a.date- interval 1 day);

问题是上述值一直有效,直到我遇到假期日期。如果星期一是假期,则这些值返回 null,因为 a.date - 间隔 1 天将不存在。解决假期问题的最佳方法是什么?

以下是目前的结果:

+------------+---------------+
| date       | X             |
+------------+---------------+
| 2018-03-26 |     -40105.00 |
| 2018-03-27 |      28470.00 |
| 2018-03-28 |       5265.00 |
| 2018-03-29 |     -23010.00 |
| 2018-04-02 |          NULL |
| 2018-04-03 |     -24830.00 |
| 2018-04-04 |     -21970.00 |
| 2018-04-05 |      -9620.00 |
| 2018-04-06 |      36465.00 |

提前致谢!!

标签: mysqlfinance

解决方案


我将按日期对表格进行排序,然后分配一个从 1 到 n 的序列或一系列数字。然后,我将从除第一行之外的前一行中减去当前行的值。对于第一行,我将复制值 X。

select rnk2.`date`, 
case when rnk1.r1=1 and rnk2.r2=1 then rnk1.X else rnk2.X-rnk1.X end as 'Daily Total'
from (
  select `date`,X,@r1:=@r1+1 as r1
  from  samples, (select @r1:=0) a 
  order by `date` ) rnk1
inner join 
  (select `date`,X,@r2:=@r2+1 as r2
   from  samples, (select @r2:=0) b
   order by `date`) rnk2
on (rnk1.r1=1 and rnk2.r2=1) or (rnk1.r1+1=rnk2.r2) 
order by rnk2.`date`

推荐阅读