这看起来是一个非常简单的查询,但我一定遗漏了一些明显的内容。我认为这种情况很常见。
我有一张存储产品的表和另一张存储交易的表。交易表包含有关销售人员的信息。现在,我需要制作一份报告,列出所有产品,并包括上次销售该产品的销售人员的id。
我尝试了一个简单的查询,比如:
选择id,product_name,(从中选择salesman_id(选择salesman_id来自trans其中product_id=a.id按trans_date desc排序)其中rownum=1)salesman_id来自的产品
此查询在.id.上给了我无效的标识符
所以在搜索完网络后,我试图在其中添加一个LATERAL子句
选择id,product_name,salesman_id从产品a,LATERAL(从中选择salesman_id(选择salesman_id来自trans其中product_id=a.id按trans_date desc排序)其中rownum=1)
但是这个查询给了我不完整的SQL语句。
有没有一种简单的方法可以在单个查询中实现这一点?
select id, product_name, salesman_id from
(select p.id, p.product_name, t.salesman_id, row_number() over(partition by p.id order by t.trans_date desc) rw
from products p left join trans t on t.product_id = p.id
) where rw = 1;
- 联接表产品和trans
- 某些产品可能没有交易。由于您需要展示所有产品,因此需要LEFT JOIN
- 使用分析函数计算每个产品的每笔交易的订单号(row_number)(每个产品的订单号从1开始)
您只需要一个子查询,类似于:
从产品p、trans t中选择p.id、p.product_name、t.salesman_id其中t.product_id=p.product_id并且t.trans_date=(从trans_in中选择max(trans_date),其中t_in.product_id=t.product_id)