我正在尝试在 HackerRank 上解决这个问题。在这个问题中,我必须对连续的日期进行分组。当两个日期之间的差为 1 时,两个日期是连续的,并且在此问题陈述中,开始日期和结束日期始终是连续的。
我的方法是将连续的日期分组。为了识别连续日期,我使用了一个变量@rn
。当current start
日期等于前一个日期时end date
,我将拥有相同的日期rn
,否则我将递增rn
。然后我想分组rn
并从每个组中获取相同的min(start date)
和) 。但在实现这个逻辑之前,我遇到了一个问题,即使条件位于 MySQL 的子句内部,变量也会递增。max(end date
rn
@rn
when
false
case
set @rn = 0;
with tasks as (
select distinct Start_Date, End_Date
from Projects
order by Start_Date
)
select
Start_Date, End_Date,
case
when lag(End_Date, 1) over(Order by Start_Date) != Start_Date then @rn:=@rn+1
else @rn
end as cnt
from tasks
在上面的查询中,@rn := @rn+1
即使when
条件为 ,也会执行false
。
我遇到了这个问题,试图解决HackeRank的问题。
如果有人能解释为什么@run := @rn+1
即使条件成立也会被执行,false
那就太好了。
以下是上述查询针对指定问题生成的输出:
我得到的输出:
2015-10-01 2015-10-02 0
2015-10-02 2015-10-03 1
2015-10-03 2015-10-04 2
2015-10-04 2015-10-05 3
2015-10-11 2015-10-12 24
2015-10-12 2015-10-13 5
2015-10-15 2015-10-16 24
2015-10-17 2015-10-18 24
2015-10-19 2015-10-20 24
2015-10-21 2015-10-22 24
2015-10-25 2015-10-26 24
...
我期待的输出
2015-10-01 2015-10-02 1
2015-10-02 2015-10-03 1
2015-10-03 2015-10-04 1
2015-10-04 2015-10-05 1
2015-10-11 2015-10-12 2
2015-10-12 2015-10-13 2
2015-10-15 2015-10-16 3
2015-10-17 2015-10-18 4
2015-10-19 2015-10-20 5
2015-10-21 2015-10-22 6
2015-10-25 2015-10-26 7
...
鉴于您使用的是 MySQL 8+,它提供了窗口函数,甚至不需要求助于使用会话/用户变量。在窗口函数的帮助下,您的查询实际上很容易表达:
在 mysql 8 之前,执行此操作的方法是使用交叉连接
https://dbfiddle.uk/FZMrDDnb
您的查询未按您预期的方式运行,因为窗口函数和 UDV 表达式未按您预期的顺序进行计算。这与当您尝试在 HAVING 子句中使用窗口函数时导致引发错误的原因相同。我不明白为什么它会产生这样的值,但它肯定与评估顺序有关。
为了使当前的方法发挥作用,您需要在另一个 CTE 中执行额外的步骤:
由于 的值
cnt
仅用于Projects
根据连续的End_date
s 将它们分组在一起,因此您可以使用以下date - INTERVAL seq DAY
方法:这是一个db<>fiddle。