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

自动加入?前一周工作的员工在3周前是否活跃-MYSQL,mysql,sql,datetime,date-arithmetic,domo,Mysql,Sql,Datetime,Date Arithmetic,Domo,我正在尝试向生产时数数据集中添加一个列,该列将显示上周工作的提供商是否也在三周前工作。当前数据集如下所示: 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

我正在尝试向生产时数数据集中添加一个列,该列将显示上周工作的提供商是否也在三周前工作。当前数据集如下所示:

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 
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
我试图获得一个额外的列“活动3周前”,其中的值为y/n或1/0。对于上表,假设提供者是在20年10月13日启动的。新列的理想填充方式如下:

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 
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和DOSWeek的连接可能有缺陷?这就是我一直在玩的东西


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

如果您运行的是MySQL 8.0,您可以使用窗口函数和范围规范:

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周内检查任何记录,请将窗口范围更改为:

range between interval 3 week preceding and interval 1 day preceding
如果您希望在MySQL<8.0中实现这一点,其中没有可用的窗口函数,那么您可以使用相关子查询:

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

对不起,我不清楚。我所说的前三周工作的意思是,providerID在当前行前三周是否有任何服务日期。因此,在示例表中,前两行显示为“是”,因为提供者在11月10日的一周内工作,而第三行显示为“否”,因为提供者在11月10日的一周内开始工作,因此没有提前三周工作。我会试试你的建议,谢谢!不幸的是,我在DOMO中这样做,由于使用了MySQL 5.6,它似乎不支持OVER子句……这看起来很完美,非常感谢!现在我很好奇这个解决方案与我所找到的东西有多大的差距——什么样的搜索词可能更接近这个方向?关于比较同一数据集中的行,我查找的所有内容都指向自连接。但愿我看到过任何引用存在于与SELECT 1和WHERE逻辑的组合中。再次感谢你。给我们看看你的代码。当然,在我发布之前,我已经做了大量的挖掘和尝试。当我在寻找正确提问的方法时,似乎提供样本数据是最好的方法,我不确定您对MRE还有什么要求。我没有提供我在代码方面的尝试,因为我认为它们离我们太远了。您是否希望我将样本数据作为创建表并插入,否则我不确定我能澄清什么。这是如何“再现”的?