【问题标题】:Find if event happened within N days after every record using SQL使用 SQL 查找每条记录后 N 天内是否发生事件
【发布时间】:2021-12-23 16:50:56
【问题描述】:

我试图找出一种方法来在 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

【问题讨论】:

  • 标记垃圾邮件并不能帮助我们帮助您。标记您真正使用的RDBMS,并且该RDBMS。

标签: sql datetime impala


【解决方案1】:

所以一般来说,有两种方法。您可以创建一个标量函数(或 UDF),它接受所需的参数来对同一个表运行查询以查找相关事件 B,然后它只返回 true 或 false。这不会是很好的表现。

或者,您可以使用存储过程并使用游标遍历它们,组装要返回的最终结果集。

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      猜你喜欢
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      相关资源
      最近更新 更多