首页 > 解决方案 > 使用 SQL 识别具有开始日期和结束日期的时间段

问题描述

我正在为一个研究项目准备一些数据,并且在应对以下挑战时遇到了麻烦。如果可能的话,我想用 SQL 或 PL SQL 来做所有事情(尽管我是一个真正的 PL 新手)。

假设我们有下表(注意 Period_ID 是我要创建的所需行):

+-------+-----------+--------------+--------------+-----------+
| Row # | Person_ID |     Code     |     Date     | Period_ID |
+-------+-----------+--------------+--------------+-----------+
|     1 |         1 | Start_period | Jan 1st      |         1 |
|     2 |         1 | End_period   | Jan 15th     |         1 |
|     3 |         1 | Random_code1 | Feb 15th     |         1 |
|     4 |         1 | Random_code2 | Feb 28th     |         1 |
|     5 |         1 | End_period   | March 31st   |         1 |
|     6 |         1 | Start_period | May 31st     |         2 |
|     7 |         1 | End_period   | June 11th    |         2 |
|     8 |         1 | End_period   | October 28th |         2 |
+-------+-----------+--------------+--------------+-----------+

专栏和挑战:

标签: sqloraclegaps-and-islands

解决方案


只需计算每行的开始时间段数:

select t.*,
       sum(case when code = 'Start_period' then 1 else 0 end) over (partition by person_id order by date) as period_id
from t;

这适用于您提供的数据。它没有正式纳入其他规则,例如结束时段之间的时间。


推荐阅读