我真的很感谢对此的帮助..我需要通过实现以下逻辑来保留该表中 ID 为 (1,4,6) 的行。 逻辑是这样的:总是选择第一笔销售。然后,我需要选择下一次销售,其中 sale_date 至少比上一次选择的销售日期晚 6 个月(第 1 行)。这是棘手的部分 - 这是一种递归。我需要选择 sale_date 距上一个选定行(不是原始数据中的上一行)至少 6 个月后的每一行。 这就是为什么应选择 ID=4 - 它距上一个选定行 (ID=1) 6 个月以上,而且 ID=3 后 6 个月内也没关系,因为未选择 ID=3。选择 ID=6 是因为它比上一个选定行 (ID=4) 晚了 6 个月。该表只是一个示例,它会随着销售(以及销售人员和客户)添加更多行而增长。 我希望我的解释很清楚。我认为递归在这里很有用;我尝试过,但没能成功/任何帮助将不胜感激
您不能在查询的递归部分使用窗口函数。
您可以准备之前的销售日期 (prev_sale_date) 并在递归的连接条件中使用此列。
参见示例
with recursive
saleRanges as(
select *
,coalesce((lag(sale_date)over(partition by CLient order by sale_date) )
,sale_date) as prev_sale_date
from data
)
,r as(
select id,Client,SalesPerson,sale_date,prev_sale_date
from saleRanges
where Client='Cl1' and sale_date=(select min(sale_date) from data where Client='Cl1')
union all
select t.id,t.Client,t.SalesPerson,t.sale_date,t.prev_sale_date
from r inner join saleRanges t on t.Client=r.Client
and t.sale_date>date_add(r.sale_date,interval 6 month)
and t.prev_sale_date<date_add(r.sale_date,interval 6 month)
)
select * from r order by Client,sale_date;
id | 客户 | 销售人员 | 销售日期 | 上一销售日期 |
---|---|---|---|---|
1 | Cl1 | 杰克 | 2023-01-01 | 2023-01-01 |
4 | Cl1 | 杰克 | 2023-09-01 | 2023-06-01 |
6 | Cl1 | 杰克 | 2024-04-01 | 2023-11-01 |