SQL按日期范围加入

时间:2011-04-16 23:17:14

标签: sql

我在使用SQL查询时遇到了一些令人沮丧的时间,并且可以真正使用帮助。基本上,我有一个客户互动表(销售访问),其中包含customer_idsales_locationvisit_date。我有一个单独的表,其中包含该访问产生的订单。一些访问导致零订单,而其他访问导致多个订单。订单表包含customer_idorder_date,每行代表不同的订单。

我需要创建一个合并的表,每个订单或访问都有一行链接到订单来源的sales_location。基本上,这些表的设计很差,我们需要了解哪些销售地点每次访客都会产生大量订单。

我需要做的,以及我正在努力解决的问题,就是使用SQL根据order_date隐式地找出与customer_id相关联的交互。例如,假设我们在里诺与客户#463进行了互动,然后在达拉斯与两个日期进行了两次互动。由于里诺旅行我们可能有3个订单,而达拉斯之旅可能有一个订单(或没有)。我需要使用订单的日期来确定订单来自哪个销售地点。这样做的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

假设订单前的最后一次访问与订单相关联。

并且没有客户在同一天访问过两个(或更多)不同的位置(实际上,这会在结果中显示两次访问与下一次销售相关)。

SELECT s.customer_id
     , s.sales_location
     , s.visit_date
     , g.customer_id
     , g.order_date
FROM sales_location s
  FULL JOIN                       <--- replace with LEFT JOIN
    ( SELECT o.customer_id
           , MAX(s.visit_date) AS last_visit_date
           , o.order_date
      FROM order o 
        LEFT JOIN sales_location s
          ON  s.customer_id = o.customer_id
          AND s.visit_date <= o.order_date
      GROUP BY o.customer_id
             , o.order_date
    ) AS g
    ON  g.customer_id = s.customer_id
    AND g.last_visit_date = s.visit_date

您可以用LEFT JOIN替换FULL JOIN。只有效果是不会显示无法与访问相关的订单(没有任何先前客户访问任何sales_locations的订单)。