我正在HackerRank上try 解决这problem个问题.在这个问题中,我必须对连续的日期进行分组.当两个日期之间的差为1时,两个日期是连续的,并且在此问题陈述中,开始日期和结束日期始终是连续的.

我的方法是对连续的日期进行分组.为了识别连续日期,我使用了变量@rn.当current start日期等于之前的end date时,我将得到相同的rn,否则我将增加rn.然后我想按rn分组,并从每个组中获得min(start date)max(end date)具有相同的rn.但在实现这个逻辑之前,我遇到了一个问题,即即使when条件是false@rn变量也会增加.

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

在上述查询中,即使当when 条件为false时,也执行@rn := @rn+1.

我遇到了这个问题,试图从HackeRank中解决a problem.

如果有人能解释为什么即使条件是false 也会执行@run := @rn+1,那就太好了.

以下是上述查询为指定问题生成的输出:

我得到的输出:

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

...

推荐答案

鉴于您使用的是SQL 8+,它提供了窗口函数,因此甚至不需要使用会话/用户变量. 在窗口函数的帮助下,您的查询实际上很简单:

WITH cte AS (
    SELECT *, CASE WHEN LAG(End_Date) OVER (ORDER BY Start_Date) != Start_Date
                   THEN 1 ELSE 0 END AS cnt
    FROM tasks
)

SELECT Start_Date, End_Date, 1 + SUM(cnt) OVER (ORDER BY Start_Date) AS total
FROM cte
ORDER BY Start_Date;

Mysql相关问答推荐

JOOQ-如何在一个查询中引用多个(但不是所有)表中的所有字段

根据SQL中的平均范围对学生进行排名

MySQL逻辑全部

Python - 执行原始 SQL 时获取更新查询 (Mysql) 的结果

在 mySQL 中计算每日数组的每周指标

我可以在姓名和姓名日期之间进行搜索吗?

如何确保 SQL 记录的列不引用它自己的主键?

替代对多个表执行 FULL OUTER JOIN?

如何在 SQL 中计算留存曲线?

将 wordpress 自定义字段转换为单个数组

基于 3 个条件 Select 3 行的最佳 MySQL 索引和查询

终止空闲的mysql连接

MySQL:将日期时间插入其他日期时间字段

Spring Boot:Jdbc javax.net.ssl.SSLException:在接收对等方的 close_notify 之前关闭入站

MySQL嵌套 Select 查询?

MySQL 在每个唯一值第一次出现时 Select 行

MySQL与空值比较

使用 MySql,我可以对列进行排序但最后有 0 吗?

MySQL更新查询与左连接和分组依据

在 PHP 中运行 MySQL *.sql 文件