我在使用SQL查询时遇到了一些令人沮丧的时间,并且可以真正使用帮助。基本上,我有一个客户互动表(销售访问),其中包含customer_id
,sales_location
和visit_date
。我有一个单独的表,其中包含该访问产生的订单。一些访问导致零订单,而其他访问导致多个订单。订单表包含customer_id
和order_date
,每行代表不同的订单。
我需要创建一个合并的表,每个订单或访问都有一行链接到订单来源的sales_location
。基本上,这些表的设计很差,我们需要了解哪些销售地点每次访客都会产生大量订单。
我需要做的,以及我正在努力解决的问题,就是使用SQL根据order_date
隐式地找出与customer_id
相关联的交互。例如,假设我们在里诺与客户#463进行了互动,然后在达拉斯与两个日期进行了两次互动。由于里诺旅行我们可能有3个订单,而达拉斯之旅可能有一个订单(或没有)。我需要使用订单的日期来确定订单来自哪个销售地点。这样做的最佳方式是什么?
答案 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的订单)。