首页 > 解决方案 > 在动态日期范围之间提取数据

问题描述

下面是查询,其中sf.flex_start_date&sf.flex_end_date是 的变量mis.seller_org_id。需要帮助才能获取seller_org_id特定的数据date range。即卖方的数据应该只在它之后start date和之前end date可用(数据在开始日期之前和结束日期之后也可用,但需要该日期范围之间的数据,并且该范围因不同而不同seller_org_id)。

任何人都可以帮忙吗?

SELECT mis.order_id
    ,mis.order_status
    ,mis.seller_org_id
    ,mis.category
    ,mis.order_date
    ,log.rts_date
    ,log.picked_up_time
    ,sf.seller_name
    ,sf.parent_seller_org_id
    ,sf.parent_seller_name
    ,sf.seller_zone
    ,sf.seller_city
    ,sf.flex_supervisor_name
    ,sf.flex_start_date
    ,sf.flex_end_date
    ,sf.flex_status
FROM common.mis_table mis
LEFT JOIN logistics.logistics_data_full log ON mis.order_id = log.seller_order_id
LEFT JOIN ds_csv_seller_flex_seller_list sf ON mis.seller_org_id = sf.seller_org_id
WHERE mis.category NOT IN (
        'Food-FMCG'
        ,'Pharma'
        ,'Fullfilment Material'
        ,'Meat'
        ,'Fresh'
        )
    AND mis.fulfillment_center = 'FFC_SELLER'
    AND mis.order_date >= '2020-07-01'
    AND mis.order_date BETWEEN sf.flex_start_date
        AND sf.flex_end_date

标签: mysqlsql

解决方案


您的where子句正在将您的子句left join变成内部连接。with left joins 第一个表上的所有条件都应该在where子句中。后续表的任何条件都应在on子句中:

select . . .
from common.mis_table mis left join
     logistics.logistics_data_full log
     on mis.order_id = log.seller_order_id left join
     ds_csv_seller_flex_seller_list sf
     on mis.seller_org_id = sf.seller_org_id and
     mis.order_date between sf.flex_start_date and sf.flex_end_date
where mis.category not in ('Food-FMCG', 'Pharma', 'Fullfilment Material', 'Meat', 'Fresh') 
      mis.fulfillment_center = 'FFC_SELLER' and
      mis.order_date >= '2020-07-01'

您的查询中发生的情况是,left join可能会返回NULL不匹配的行——或者,更有可能的是,存在匹配项,但所有日期范围值都超出了您想要的范围。在任何一种情况下,where子句都会过滤掉这些值。


推荐阅读