【问题标题】:Identify dynamically time periods in SQL [closed]在 SQL 中动态识别时间段 [关闭]
【发布时间】:2020-11-21 10:24:55
【问题描述】:

我正在查找某个数据表中的标识时间段。

这是一个包含这些数据的表格(蓝色):

  • 员工:员工编号
  • 日期:活动日期
  • 主题:活动类型
  • 持续时间:持续时间

我想再创建 3 列(红色):

  • 标志:如果 Motif = Mala,则 = 1 else = 0
  • PERIOD:第一个标识活动类型为“MALA”的时间段。此列必须按员工编号显示。
  • CUMUL:第二个是计算一个周期内的连续天数。此列也必须按员工编号显示。

我暂时没有解决办法... 感谢您的帮助!

更新:2020 年 11 月 23 日 @GMB 的解决方案很好用,非常感谢

另一个问题:如果同一日期有 2 行,我想:

  • 如果 2 行中有 1 行是 MOTIF=MALA,我只想保留这一行
  • 如果 2 行是 MOTFMALA 我想保留这 2 行

【问题讨论】:

  • 我不关注。您说您想要两个新列,但您的示例包含三列。而且列也不一样。
  • 我添加一些细节以供理解

标签: sql datetime gaps-and-islands


【解决方案1】:

这是一个孤岛问题。您可以使用行号之间的差异来识别组,然后跨组和组内:

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

【讨论】:

  • 完美它工作正常!非常感谢:)
  • 另一个问题:如果同一日期有 2 行,我想: - 如果 2 行中有 1 行是 MOTIF=MALA,我只想保留这一行 - 如果 2 行是MOTFMALA 我想保留这两行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 2013-05-23
  • 2013-11-26
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
相关资源
最近更新 更多