在Tableau中创建订单重叠(Overlap)标记字段并计算重叠天数
订单重叠判断与重叠天数计算(单字段实现)
完全可以通过单个计算字段实现需求,无需提前单独创建order_end_date字段,直接在计算逻辑中推导订单结束日期即可。以下分两种需求给出具体实现方式:
1. 判断订单是否重叠的计算字段
核心逻辑是检查当前订单的时间区间与任意历史订单的时间区间是否存在交集:
- 历史订单的结束日期(
Date_of_Order + Days_Supply)晚于当前订单的下单日期 - 历史订单的下单日期早于当前订单的结束日期(
Date_of_Order + Days_Supply)
以通用SQL为例,计算字段可写为:
CASE WHEN EXISTS ( SELECT 1 FROM orders o_hist WHERE o_hist.order_id <> o_current.order_id -- 排除当前订单自身 AND DATEADD(day, o_hist.Days_Supply, o_hist.Date_of_Order) > o_current.Date_of_Order AND o_hist.Date_of_Order < DATEADD(day, o_current.Days_Supply, o_current.Date_of_Order) ) THEN '重叠' ELSE '不重叠' END AS is_overlap
2. 计算重叠天数的计算字段
通过取两个订单区间的最大开始日期和最小结束日期,计算两者的差值(差值为正则为重叠天数,否则为0)。如果需要统计与所有历史订单的总重叠天数,可结合聚合函数实现:
SELECT o_current.*, COALESCE( SUM( GREATEST( 0, DATEDIFF( day, GREATEST(o_current.Date_of_Order, o_hist.Date_of_Order), LEAST(DATEADD(day, o_current.Days_Supply, o_current.Date_of_Order), DATEADD(day, o_hist.Days_Supply, o_hist.Date_of_Order)) ) ) ), 0 ) AS total_overlap_days FROM orders o_current LEFT JOIN orders o_hist ON o_hist.order_id <> o_current.order_id AND DATEADD(day, o_hist.Days_Supply, o_hist.Date_of_Order) > o_current.Date_of_Order AND o_hist.Date_of_Order < DATEADD(day, o_current.Days_Supply, o_current.Date_of_Order) GROUP BY o_current.order_id, o_current.Date_of_Order, o_current.Days_Supply;
补充:BI工具中的实现(以Tableau为例)
如果是在Tableau等BI工具中,计算字段逻辑类似:
- 判断重叠:
IF EXISTS( [Orders].[Order ID] != [Orders (History)].[Order ID] AND DATEADD('day', [Orders (History)].[Days Supply], [Orders (History)].[Date of Order]) > [Orders].[Date of Order] AND [Orders (History)].[Date of Order] < DATEADD('day', [Orders].[Days Supply], [Orders].[Date of Order]) ) THEN '重叠' ELSE '不重叠' END - 计算重叠天数:
SUM( MAX( 0, DATEDIFF('day', MAX([Orders].[Date of Order], [Orders (History)].[Date of Order]), MIN(DATEADD('day', [Orders].[Days Supply], [Orders].[Date of Order]), DATEADD('day', [Orders (History)].[Days Supply], [Orders (History)].[Date of Order])) ) ) )
内容的提问来源于stack exchange,提问作者Addy
相关产品推荐
相关产品推荐

