【问题标题】:MYSQL - Finding row delta using date rows that include holidaysMYSQL - 使用包含假期的日期行查找行增量
【发布时间】:2018-10-07 12:55:45
【问题描述】:

我有一个表格,其中包含一个带有日期的字段(称为日期)和一个带有累积运行总计的字段(称为 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 |

提前致谢!!

【问题讨论】:

  • 如果星期一是假期,正确的逻辑是什么?从周日开始?将其设置为零?
  • 如果周一是节假日,从上周五开始获取。谢谢你的提问。澄清一下,日期字段是不包括周末和节假日的工作日。所以基本上如果星期一是假期,那么我希望 a.date(星期二)从 b.date(星期五)中减去。
  • 到目前为止我有这个“b.date = if(weekday(a.date) = 0, ifnull(a.date - 间隔 3 天,a.date - 间隔 4 天), ifnull( a.date - 间隔 1 天,a.date - 间隔 4 天))“但由于某种原因我仍然得到 Null 值....
  • 您不能减去 4,因为星期五也可能是假期。会解决这个问题。
  • 说得好,你太棒了,谢谢!

标签: mysql finance


【解决方案1】:

我将按日期对表格进行排序,然后分配一个或一系列从 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`

【讨论】:

  • 你先生@âńōŋŷXmoůŜ是个巫师。是的,效果很好!非常感谢!
  • 很高兴听到这个消息。请按我的答案上的检查按钮接受它。
  • 所以这行得通,但我无法从中创建视图。回到我之前完成的另一个例子,你知道为什么 "b.date = if(weekday(a.date) = 0 , ifnull(a.date - 间隔 3 天,a.date - 间隔 4 天), ifnull(a. date - 间隔 1 天,a.date - 间隔 4 天))" 仍然创建一个空值?
  • 因为我无法从中创建视图,所以我仍在寻找答案。在我的脑海中,从逻辑上讲,“b.date = if(weekday(a.date) = 0,ifnull(a.date - 间隔 3 天,a.date - 间隔 4 天),a.date - 间隔 1 天)”这是有道理的。但我仍然得到 NULL 值。这是为什么呢?
  • 让我看看您在从查询中创建视图时遇到的错误。引用:“但我无法从中创建视图”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
相关资源
最近更新 更多