sql - 根据 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
解决方案
这将“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)
推荐阅读
- android - java.lang.IllegalStateException ConstraintLayout 没有为片段设置 NavController
- javascript - 在没有排序功能的情况下对数组进行排序并删除重复项
- linux - Linux:写入 i2c/SMBus
- elasticsearch - 用于获取字段中具有空值的记录的 Elasticsearch 查询
- javascript - JavaScript 中的 JSON.parse(this.response) 字符串问题
- java - 这是策略模式(JAVA,鸭子的飞行方法)的正确实现吗?
- c# - Entity Framework Core 代码首先仍然显示已删除的记录 sqlite
- java - spring security 和 basic auth 只有一个 entryPoint:如何管理另一个端点上的错误
- python - Python 抓取谷歌搜索结果
- python - Python + 工作表 | 我可以知道使用 BatchUpdate 更改 BGcolor 的语法吗?