我们说我有两张桌子。一个表格包含员工信息和员工获得晋升的日期:
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语句中使用它们。我不知道如何处理这个问题。
答案 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;