我试图找出一种方法,在SQL中查找一个事件是否在N天内发生了不同的事件
例如,如果我的数据如下:
User_ID Code Date
1122 A 01-01-2020
1122 A 02-01-2020
1122 A 02-01-2020
2233 A 04-01-2020
2233 A 04-01-2020
1122 B 04-01-2020
3344 A 07-01-2020
3344 B 07-01-2020
2233 A 08-01-2020
假设N=2,这意味着我需要找出事件B是否在2天内发生,每个用户的事件A,如果是这样,我需要过滤掉事件A
因此,在我的数据中,在第1天有一个事件A,在第2天有两个用户1122的事件A,然后在第4天有事件B。事件B发生在用户1122的第一个事件A之后3天,以及用户1122在两个事件A后2天。所以这两个A事件应该被标记:(对于与A在同一天发生事件B的用户3344也是如此,因此也符合2天(
User_ID Code Date B_within_2_days
1122 A 01-01-2020 NO
1122 A 02-01-2020 YES
1122 A 02-01-2020 YES
2233 A 04-01-2020 NO
2233 A 04-01-2020 NO
1122 B 04-01-2020 NO
3344 A 07-01-2020 YES
3344 B 07-01-2020 NO
2233 A 08-01-2020 NO
因此,通常有两种方法。您可以创建一个标量函数(或UDF(,该函数接受所需的参数,以针对同一个表运行查询,查找相关的事件B,然后它只返回true或false。这将不是一场精彩的演出。
或者,您可以使用一个存储过程,并使用光标遍历它们,组装要返回的最终结果集。
select User_ID, Code, "Date",
case when Code = 'A' and exists (
select 1 from T where Code = 'B'
and "Date" between t1."Date" and date_add(t1."Date", 2)
) T then 'YES' else 'NO' end as B_within_2_days
from T t1