首页 > 解决方案 > 根据一列/SQL Oracle 中的值创建时间间隔

问题描述

我需要创建将从表中返回时间间隔的查询,该查询具有(几乎)每天的属性。
原始表如下所示:

Person | Date       | Date_Type
-------|------------|----------
Sam    | 01.06.2020 |  Vacation
Sam    | 02.06.2020 |  Vacation
Sam    | 03.06.2020 |  Work
Sam    | 04.06.2020 |  Work
Sam    | 05.06.2020 |  Work
Frodo  | 01.06.2020 |  Work
Frodo  | 02.06.2020 |  Work
.....

期望的应该是这样的:

Person | Date_Interval         | Date_Type
-------|-----------------------|----------
Sam    | 01.06.2020-02.06.2020 |  Vacation
Sam    | 03.06.2020-05.06.2020 |  Work
Frodo  | 01.06.2020-02.06.2020 |  Work
.....

将不胜感激任何想法:)

标签: sqloracledatetimegaps-and-islands

解决方案


这是一种差距和孤岛问题。

要获得相同的相邻日期date_type,您可以减去一个序列。它将在相邻的日子里保持不变。然后你可以聚合:

select person, date_type, min(date), max(date)
from (select t.*,
             row_number() over (partition by person, date_type
                                             order by date) as seqnum
      from t
     ) t
group by person, date_type, (date - seqnum);

推荐阅读