首页 > 解决方案 > 根据 SQL / Hive 中的条件比较同一列中的日期

问题描述

我有一个具有以下架构的表。

每个 person_id 可以有多个与其关联的代码(A、B、C、D 等)。对于代码为“A”的每个 person_id,将相应日期与该人可能拥有的所有其他代码的日期进行比较,并过滤掉代码“A”日期后 6 个月内的日期

所以以第一个 person_id 30038590555 为例,我想确保代码 B 和 C 的日期在 A 日期的 6 个月内。由于两者都高于 6 个月的阈值,因此应该将它们过滤掉。

person_id   code    Date
30038590555 B   5/16/2017
30038590555 C   1/9/2019
30038590555 A   1/25/2020
37057397055 A   3/21/2020
38438355555 A   1/25/2020
59385393355 C   7/22/2014
59385393355 A   2/22/2020
44384037555 A   12/21/2019
49384037555 A   3/21/2020
50573409355 D   4/5/2016
50573409355 A   4/6/2016
50573409355 F   4/7/2016
50573409355 G   3/2/2017
50573409355 B   3/7/2017

标签: sqldatehive

解决方案


这将“6 个月内”解释为“6 个月后”。如果它真的意味着 6 个月之前或之后,则可以调整解决方案。

如果我理解正确,您希望保留所有“A”,然后保留 A 六个月内的所有其他人。使用有条件的运行最大值:

select t.*
from (select t.*,
             max(case when code = 'A' then date end) over (partition by person_id order by date) as prev_a_date
      from t
     ) t
where code = 'A' or prev_a_date > add_months(date, -6)

推荐阅读