自助加入?前一周工作的员工在 3 周前是否活跃 - MYSQL

Self Join? Were Staff Who Worked the Previous Week Active 3 Weeks ago - MYSQL

我正在尝试向生产时间数据集添加一列,以告知上周工作的提供商是否也在三周前工作。当前数据集看起来像这样:

RowID | ProviderID | ClientID |     DOS    |   DOS (Week)  | Hours 
  1   | 1111111111 | 22222222 | 11/2/2020  |   11/1/2020   | 2.5 
  2   | 1111111111 | 33333333 | 11/5/2020  |   11/1/2020   | 1 
  3   | 1111111111 | 44444444 | 10/13/2020 |   10/11/2020  | 3 

我正在尝试使用 y/n 或 1/0 作为值来获取额外的列 'Active 3 Weeks Prior'。对于上述 table,我们假设提供商于 2020 年 10 月 13 日开始。新列最好像这样填充:

RowID | ProviderID | ClientID |     DOS    |   DOS (Week)  | Hours | Active 3 weeks Prior 
  1   | 1111111111 | 22222222 | 11/2/2020  |   11/1/2020   | 2.5   |   Yes              
  2   | 1111111111 | 33333333 | 11/5/2020  |   11/1/2020   | 1     |   Yes
  3   | 1111111111 | 44444444 | 10/13/2020 |   10/11/2020  | 3     |   No

一些额外的花絮:我们的组织使用周日作为一周的开始,因此 DOS(周)是服务日期之前的周日。从我到目前为止所读的内容来看,这里的解决方案似乎是某种自连接,其中将基本生产记录汇总到每周小时数中,并与同一 providerID 的 DOS(周)- 21 记录进行比较。

我遇到的问题是:首先我是否在自连接的正确轨道上以及如何根据找到的成功或失败生成 y/n 值一个匹配值。另外,我怀疑基于 ProviderID 和 DOS(Week) 的连接可能存在缺陷?这是我到目前为止一直在玩的东西。

请让我知道我是否可以澄清这个问题或者遗漏了一些非常明显的东西。我真的很感谢任何帮助,因为几天来我一直在努力找出正确的搜索词以获得答案的线索。

如果你是运行 MySQL 8.0,你可以使用window函数和range规范:

select t.*,
    (
        max(providerid) over(
            partition by providerid 
            order by dos
            range between interval 3 week preceding and interval 3 week preceding
        ) is not null
    ) as active_3_weeks_before
from mytable t

根据您的解释和数据,您所说的三周前也能正常工作的意思并不清楚。查询所做的是,对于每一行,检查是否存在具有相同供应商的另一行和 dos 正好在当前行的 dos 之前 3 周。这可以很容易地适应其他一些要求。


编辑:如果您想检查最近 3 周内的 任何 记录,您可以更改 window范围为:

range between interval 3 week preceding and interval 1 day preceding

如果你想在 MySQL < 8.0 中使用 window 函数,那么你可以使用相关子查询:

select t.*,
    exists (
        select 1
        from mytable t1
        where 
            t1.providerid = t.provider_id
            and t1.dos >= t.dos - interval 3 week
            and t1.dos <  t.dos
    ) as active_3_weeks_before
from mytable t