在 SQL 中动态识别时间段
Identify dynamically time periods in SQL
我在某个数据中寻找识别时间段table。
这是一个 table 数据(蓝色):
- 员工:员工编号
- 日期:活动日期
- 主题:活动类型
- 持续时间:持续时间
我想再创建 3 个列(红色):
- FLAG:如果 Motif = Mala,则 = 1 否则 = 0
- PERIOD:第一个标识活动类型为“MALA”的时间段。此列必须按员工编号工作。
- CUMUL:二是统计一段时间内连续的天数。此栏也必须按员工编号工作。
暂时没有解决办法...
感谢您的帮助!
更新:2020 年 11 月 23 日
@GMB 的解决方案很好,非常感谢
另一个问题:如果同一日期有 2 行,我想:
- 如果 2 行中的 1 行是 MOTIF=MALA 我只想保留这一行
- 如果这两行是 MOTF<>MALA 我想保留这两行
这是一个空岛问题。您可以使用行号之间的差异来识别组,然后跨组和组内:
select employee, date, motif, duration,
case when motif = 'MALA' then 1 else 0 end as flag,
dense_rank() over(partition by employee order by rn1 - rn2) period,
row_number() over(partition by employee, rn1 - rn2 order by date) as cumul
from (
select t.*,
row_number() over(partition by employee order by date) rn1,
row_number() over(partition by employee, motif order by date) rn2
from mytable t
) t
我在某个数据中寻找识别时间段table。
这是一个 table 数据(蓝色):
- 员工:员工编号
- 日期:活动日期
- 主题:活动类型
- 持续时间:持续时间
我想再创建 3 个列(红色):
- FLAG:如果 Motif = Mala,则 = 1 否则 = 0
- PERIOD:第一个标识活动类型为“MALA”的时间段。此列必须按员工编号工作。
- CUMUL:二是统计一段时间内连续的天数。此栏也必须按员工编号工作。
暂时没有解决办法... 感谢您的帮助!
更新:2020 年 11 月 23 日 @GMB 的解决方案很好,非常感谢
另一个问题:如果同一日期有 2 行,我想:
- 如果 2 行中的 1 行是 MOTIF=MALA 我只想保留这一行
- 如果这两行是 MOTF<>MALA 我想保留这两行
这是一个空岛问题。您可以使用行号之间的差异来识别组,然后跨组和组内:
select employee, date, motif, duration,
case when motif = 'MALA' then 1 else 0 end as flag,
dense_rank() over(partition by employee order by rn1 - rn2) period,
row_number() over(partition by employee, rn1 - rn2 order by date) as cumul
from (
select t.*,
row_number() over(partition by employee order by date) rn1,
row_number() over(partition by employee, motif order by date) rn2
from mytable t
) t