SQL: 查询带有每日标记 table 的单一日期 table

SQL: querying a single-date table with a daily-flag table

我有两个 table 如下所示 - 一个 table 每个 ID 都有一行,以及某个事件发生的日期(如果事件尚未发生则为 null );另一个 table 为每个 ID 标记警告标志 'Y' 的每个日期都有一行,如果未标记该标志,则该 ID 和日期没有行:

(注意英国日期格式)

ID    Event Date
1     04/09/2018
2     null
3     05/09/2018
4     07/09/2018

ID    Date         Warning Flag
1     01/09/2018   Y
1     02/09/2018   Y
1     03/09/2018   Y
2     01/09/2018   Y
2     02/09/2018   Y
2     03/09/2018   Y
3     01/09/2018   Y
3     02/09/2018   Y
3     03/09/2018   Y
4     01/09/2018   Y
4     02/09/2018   Y
4     06/09/2018   Y

我想 select 任何事件日期的 ID 在该事件日期的前一天标记有警告标志,以及警告标志串开始的日期。所以

ID  First Warning Date
1   01/09/2018
4   06/09/2018

ID2 没有活动日期; ID3 在事件日期的前一天没有警告标志;而ID4有两串warning flags,但只计算最近的那串。

我什至不知道如何开始,有什么指示吗?

在尝试构建查询之前,您会重新排列任何tables/build摘要table,还是可以在一个查询中全部完成?

[这最终将由 Oracle 或 HiveQL 中的其他人编码,但我想在查询逻辑到达之前了解查询逻辑,因为他们无论如何都会问我:)]

这是群岛问题的变体。您可以先将警告划分为不同的范围。

请注意,日期算法特定于数据库,因此具体语法因数据库而异。但这是想法:

select min(date) as mindate, max(date) as maxdate
from (select df.*, row_number() over (partition by id order by date) as seqnum
      from dailyflag df
     ) df
group by date - seqnum * interval '1 day';

接下来,将其用于 join,然后一些日期算法得到您的结果:

select e.*,
       (e.event_date - df.mindate + 1) as numdays
from events e join
     (select min(date) as mindate, max(date) as maxdate
      from (select df.*, row_number() over (partition by id order by date) as seqnum
            from dailyflag df
           ) df
      group by date - seqnum * interval '1 day'
     ) df
     on e.event_date - interval '1 day' between df.mindate and df.maxdate;

我必须强调,这本质上是伪代码,因为需要为您使用的任何数据库自定义日期函数。