1

我有一个MySQL 5.x像这样的旧版本的表:

+---------+------------+------------+
| Task_ID | Start_Date | End_Date   |
+---------+------------+------------+
|       1 | 2015-10-15 | 2015-10-16 |
|       2 | 2015-10-17 | 2015-10-18 |
|       3 | 2015-10-19 | 2015-10-20 |
|       4 | 2015-10-21 | 2015-10-22 |
|       5 | 2015-11-01 | 2015-11-02 |
|       6 | 2015-11-17 | 2015-11-18 |
|       7 | 2015-10-11 | 2015-10-12 |
|       8 | 2015-10-12 | 2015-10-13 |
|       9 | 2015-11-11 | 2015-11-12 |
|      10 | 2015-11-12 | 2015-11-13 |
|      11 | 2015-10-01 | 2015-10-02 |
|      12 | 2015-10-02 | 2015-10-03 |
|      13 | 2015-10-03 | 2015-10-04 |
|      14 | 2015-10-04 | 2015-10-05 |
|      15 | 2015-11-04 | 2015-11-05 |
|      16 | 2015-11-05 | 2015-11-06 |
|      17 | 2015-11-06 | 2015-11-07 |
|      18 | 2015-11-07 | 2015-11-08 |
|      19 | 2015-10-25 | 2015-10-26 |
|      20 | 2015-10-26 | 2015-10-27 |
|      21 | 2015-10-27 | 2015-10-28 |
|      22 | 2015-10-28 | 2015-10-29 |
|      23 | 2015-10-29 | 2015-10-30 |
|      24 | 2015-10-30 | 2015-10-31 |
+---------+------------+------------+

如果这些End_Date任务是连续的,那么它们是同一个项目的一部分。我有兴趣找到已完成的不同项目的总数。

如果有多个项目具有相同的完成天数,则按Start_Date项目的顺序排序。

对于这几个示例记录,预期的输出将是:

2015-10-15 2015-10-16
2015-10-17 2015-10-18
2015-10-19 2015-10-20
2015-10-21 2015-10-22
2015-11-01 2015-11-02
2015-11-17 2015-11-18
2015-10-11 2015-10-13
2015-11-11 2015-11-13
2015-10-01 2015-10-05
2015-11-04 2015-11-08
2015-10-25 2015-10-31

我对此有点困惑。我真的很感激任何帮助。谢谢。

4

3 回答 3

2

以下查询应该有效:

   select  tmp.projectid, date_sub(max(tmp.ed2), interval max(tmp.projectdays) day) start_date,
       max(tmp.ed2) end_date, 
      max(tmp.projectdays) No_Of_ProjectDays
from
(
select t1.task_id tid1, t1.start_date sd1, t1.end_date ed1,
       t2.task_id tid2, t2.start_date sd2, t2.end_date ed2,
     case when  datediff(t2.start_date, ifnull(t1.start_date,'1000-01-01')) != 1
          then  (@pid := @pid + 1)
          else  (@pid := @pid)
     end as ProjectId,
      case when  datediff(t2.start_date, ifnull(t1.start_date,'1000-01-01')) != 1
          then  (@pdays := 1) 
          else  (@pdays := @pdays + 1)
     end as ProjectDays
     from tasks t1 right join tasks t2
on t2.task_id = t1.task_id + 1
cross join (select @pid :=1, @pdays := 1) vars
) tmp
group by tmp.projectid
order by max(tmp.projectdays), start_date

请在此处找到演示。

编辑: 我已经根据新的数据样本对查询和链接进行了更改。请看一看。

于 2020-07-11T19:10:56.683 回答
2

这回答 - 并正确回答 - 这个问题的原始版本。

嗯。. . 我认为你可以使用变量。最简单的方法是生成一个序号,然后减去这个值,从日期中获取相邻行的常量:

select min(start_date), max(end_date)
from (select t.*, (@rn := @rn + 1) as rn
      from (select t.* from tasks t order by end_date) t cross join
           (select @rn := 0) params
     ) t
group by (end_date - interval rn day);

是一个 db<>fiddle。

于 2020-07-11T11:58:35.983 回答
0

这是一个有点棘手的问题,但下面的查询可以正常工作。

它构建了两个表,一个与那个Start_Date,另一个与End_Date 那个,NOT IN End_DateStart_Date分别从表中,并 使用withProjects查询这些表并获取Start_Date WHERE Start_Date < End_Date分组以获得一个完整的项目。Start_Dateaggregate function MINEnd_Date

DATEDIFF(MIN(End_Date), Start_Date)计算 project_duration 并能够按project_duration.

SELECT Start_Date, MIN(End_Date) AS End_Date, DATEDIFF(MIN(End_Date), Start_Date) AS project_duration
FROM
    (SELECT Start_Date FROM Projects WHERE Start_Date NOT IN (SELECT End_Date FROM Projects)) a,
    (SELECT End_Date FROM Projects WHERE End_Date NOT IN (SELECT Start_Date FROM Projects)) b
WHERE Start_Date < End_Date
GROUP BY Start_Date
ORDER BY project_duration ASC, Start_Date ASC;

预期产出

+------------+------------+---------------+
| Start_Date | End_Date   | project_duration |
+------------+------------+---------------+
| 2015-10-15 | 2015-10-16 |             1 |
| 2015-10-17 | 2015-10-18 |             1 |
| 2015-10-19 | 2015-10-20 |             1 |
| 2015-10-21 | 2015-10-22 |             1 |
| 2015-11-01 | 2015-11-02 |             1 |
| 2015-11-17 | 2015-11-18 |             1 |
| 2015-10-11 | 2015-10-13 |             2 |
| 2015-11-11 | 2015-11-13 |             2 |
| 2015-10-01 | 2015-10-05 |             4 |
| 2015-11-04 | 2015-11-08 |             4 |
| 2015-10-25 | 2015-10-31 |             6 |
+------------+------------+---------------+
于 2020-07-15T13:57:13.763 回答