仅加入日期小于另一个字段中的最大日期的行

时间:2015-08-11 12:32:23

标签: sql

我们说我有两张桌子。一个表格包含员工信息和员工获得晋升的日期:

Emp_ID     Promo_Date
1          07/01/2012
1          07/01/2013
2          07/19/2012
2          07/19/2013
3          08/21/2012
3          08/21/2013

另一张桌子上每天都有员工关闭销售:

Emp_ID     Sale_Date
1          06/12/2013
1          06/30/2013
1          07/15/2013
2          06/15/2013
2          06/17/2013
2          08/01/2013
3          07/31/2013
3          09/01/2013

我想加入这两个表,以便我只包含小于最大促销日期的销售日期。所以结果看起来像这样

Emp_ID     Sale_Date     Promo_Date
1          06/12/2013    07/01/2012
1          06/30/2013    07/01/2012
1          06/12/2013    07/01/2013
1          06/30/2013    07/01/2013

其余的Emp_IDs依此类推。我尝试使用左连接执行此操作,这是

的效果
left join SalesTable on PromoTable.EmpID = SalesTable.EmpID and Sale_Date 
< max(Promo_Date) over (partition by Emp_ID)

但显然我不能在连接中使用聚合,而且我已经知道我也无法在where语句中使用它们。我不知道如何处理这个问题。

2 个答案:

答案 0 :(得分:5)

最长促销日期为:

select s.*
from sales s
where s.sales_date < (select max(promo_date)
                      from promotions p
                      where p.emp_id = s.emp_id
                     );

在此日期之前有多种方法可以获得销售,但这是一种方式:

obj

答案 1 :(得分:1)

戈登的回答是正确的!或者,您也可以对子查询执行inner join以获得所需的输出,如下所示:

SELECT s.emp_id
      ,s.sales_date
      ,t.promo_date
FROM sales s
INNER JOIN (
    SELECT emp_id
          ,max(promo_date) AS promo_date
    FROM promotions
    GROUP BY emp_id
    ) t ON s.emp_id = t.emp_id
    AND s.sales_date < t.promo_date;

SQL Fiddle Demo