SQL按日期范围联接

SQL按日期范围联接,sql,Sql,我在使用SQL查询时遇到了一些麻烦,我真的需要帮助。基本上,我有一个客户互动销售拜访表,其中有客户id、销售地点和拜访日期。我有一张单独的桌子,上面有那次访问的订单。一些访问导致零订单,而其他访问导致多个订单。订单表有客户id和订单日期,每行代表一个不同的订单 我需要创建一个合并表,其中每个订单或访问都有一行链接到订单来源的销售地点。基本上,这些表设计得很糟糕,我们需要了解哪些销售地点每次客户来访都会产生大量订单 我需要做的,也是我正在努力解决的一件事,是使用SQL根据订单日期隐式地计算出它与该

我在使用SQL查询时遇到了一些麻烦,我真的需要帮助。基本上,我有一个客户互动销售拜访表,其中有客户id、销售地点和拜访日期。我有一张单独的桌子,上面有那次访问的订单。一些访问导致零订单,而其他访问导致多个订单。订单表有客户id和订单日期,每行代表一个不同的订单

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


我需要做的,也是我正在努力解决的一件事,是使用SQL根据订单日期隐式地计算出它与该客户id关联的交互。例如,假设我们在雷诺与客户463交互,然后在达拉斯,在两个日期会有两个交互。由于雷诺之旅,我们可能收到了3份订单,而达拉斯之旅,我们收到了一份订单,或者根本没有订单。我需要使用订单的日期来确定订单来自哪个销售地点。最好的方法是什么?

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

而且,没有客户在同一天访问了两个或多个不同的地点,事实上,这将在结果中显示两次访问都与下一次销售相关

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

可以用左联接替换完全联接。唯一的效果是,无法与拜访订单关联的订单不会显示,而拜访订单是在客户之前未访问任何销售地点的情况下完成的。

假设订单之前的最后一次拜访与订单关联

而且,没有客户在同一天访问了两个或多个不同的地点,事实上,这将在结果中显示两次访问都与下一次销售相关

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

可以用左联接替换完全联接。唯一的效果是,不会显示无法与拜访订单关联的订单,而拜访订单是在客户之前未访问任何销售地点的情况下完成的。

您可以发布一些示例数据和表格设计吗?对于拜访销售关联,拜访日期和订单日期是相同的?或者订单是否可能是在与客户交互后3天内完成的?如果客户在同一天出差并下了多个订单,您将很难确定订单是在什么位置完成的。@ypercube:订单可以在与客户交互后的任何时间完成,不一定是同一天。好的,看看我的答案。您还没有告诉我们您正在使用哪些RDBMS。一些没有完全连接,因此答案应该调整。您可以发布一些示例数据和表设计吗?对于拜访销售协会,拜访日期和订单日期将是相同的?或者订单是否可能是在与客户交互后3天内完成的?如果客户在同一天出差并下了多个订单,您将很难确定订单是在什么位置完成的。@ypercube:订单可以在与客户交互后的任何时间完成,不一定是同一天。好的,看看我的答案。您还没有告诉我们您正在使用哪些RDBMS。有些没有完全连接,因此答案应该调整。这也会列出没有导致任何订单的访问吗?@Miron:您使用的是哪种数据库管理系统?例如,如果是SQL Server,则可以使用窗口功能更高效地执行查询。这是否还会列出未产生任何订单的访问?@Miron:您使用的是哪种dbms?例如,如果是SQL Server,则可以使用窗口功能更高效地执行查询。