如何解决SQL查询根据类别列查找连续的本地最大值,日期最小值
我有以下数据集
Customer_ID Category FROM_DATE TO_DATE
1 5 1/1/2000 12/31/2001
1 6 1/1/2002 12/31/2003
1 5 1/1/2004 12/31/2005
2 7 1/1/2010 12/31/2011
2 7 1/1/2012 12/31/2013
2 5 1/1/2014 12/31/2015
3 7 1/1/2010 12/31/2011
3 7 1/5/2012 12/31/2013
3 5 1/1/2014 12/31/2015
我想要实现的结果是为相同类别的客户查找连续的本地最小/最大日期,并确定日期之间的任何差距:
Customer_ID FROM_Date TO_Date Category
1 1/1/2000 12/31/2001 5
1 1/1/2002 12/31/2003 6
1 1/1/2004 12/31/2005 5
2 1/1/2010 12/31/2013 7
2 1/1/2014 12/31/2015 5
3 1/1/2010 12/31/2011 7
3 1/5/2012 12/31/2013 7
3 1/1/2014 12/31/2015 5
我的代码适用于客户1(返回所有3行)和客户2(返回2行,每个类别具有最小和最大日期),但是对于客户3,它无法确定2011年12月31日与1之间的差距2012年5月5日,类别7。
Customer_ID FROM_Date TO_Date Category
3 1/1/2010 12/31/2013 7
3 1/1/2014 12/31/2015 5
这是我的代码:
SELECT Customer_ID,Category,min(From_Date),max(To_Date) FROM
(
SELECT Customer_ID,From_Date,To_Date,row_number() over (order by member_id,To_Date) - row_number() over (partition by Customer_ID order by Category) as p
FROM FFS_SAMP
) X
group by Customer_ID,p
order by Customer_ID,Max(To_Date)
解决方法
这是一种间隙和孤岛问题。可能最安全的方法是使用累积max()
查找与先前记录的重叠。如果没有重叠,则记录的“孤岛”开始。所以:
select customer_id,min(from_date),max(to_date),category
from (select t.*,sum(case when prev_to_date >= from_date then 0 else 1 end) over
(partition by customer_id,category
order by from_date
) as grp
from (select t.*,max(to_date) over (partition by customer_id,category
order by from_date
rows between unbounded preceding and 1 preceding
) as prev_to_date
from t
) t
) t
group by customer_id,category,grp;
,
您的尝试非常接近。您只需要修复窗口函数的over()
子句:
select customer_id,max(to_date)
from (
select
fs.*,row_number() over (partition by customer_id order from_date)
- row_number() over (partition by customer_id,category order by from_date) as grp
from ffs_samp fs
) x
group by customer_id,grp
order by customer_id,min(from_date)
请注意,如示例数据所示,此方法在给定客户的时间段内不存在差距或重叠。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。