我要问你一个困扰我一段时间的问题。
我有这个数据库,注册一家商店的每笔交易,列如下:
产品代码对于每个商品都是唯一的(基本上是条形码),我想为查询中提供的每个product_code提取最新销售,所以我们说“ P914”,“ P959”和“ P953”作为输入,输出应为:
因此,我一直在尝试两种方法来实现此结果,第一种方法是使用简单的max()函数并通过以下方式分组:
select SALE_ID, max(DATE_OF_SALE) as DATE_MAX, PRODUCT_CODE, VENDOR
from SALES
where PRODUCT_CODE in ('P914', 'P953', 'P959')
and DATE_OF_SALE is not null
group by SALE_ID, VENDOR, PRODUCT_CODE order by DATE_MAX desc;
我试图通过第二个选择来限制DATE_OF_SALE的第二种方法:
select t1.SALE_ID, t1.DATE_OF_SALE, t1.PRODUCT_CODE, t1.VENDOR
from SALES t1
where t1.PRODUCT_CODE in ('P914', 'P953', 'P959')
and t1.DATE_OF_SALE = (select max(t2.DATE_OF_SALE) from SALES t2 where t2.SALE_ID = t1.SALE_ID group by product_code)
order by d_realisation desc;
两个查询都给出完全相同的结果:
我真的无法捕捉到我做错了什么以及如何正确地做。如果有人能帮助我,我将不胜感激
谢谢大家阅读!
答案 0 :(得分:1)
我想提取每个product_code的最新销售信息
您即将进行使用相关子查询进行过滤的第二次尝试。您只需要通过product_code
进行关联并从子查询中删除group by
子句:
select s.*
from sales s
where product_code in ('P914', 'P953', 'P959')
and s.date_of_sale = (
select max(s1.date_of_sale)
from sales s1
where s1.product_code = s.product_code
)
答案 1 :(得分:1)
您可以按以下方式使用analytical function
:
Select * from
(Select t.*,
Row_number() over (partition by product_code order by date_of_sale desc) as rn
From sales t
where product_code in ('P914', 'P953', 'P959')
) where rn = 1
干杯!
答案 2 :(得分:0)
您按sale_id +供应商+代码分组,这样您将获得每个销售/供应商/代码组合的最后一条记录,而不是每个sale_id的最后一条记录。
修复,仅按产品代码分组:
假设ID与您的示例中的sale_dates顺序相同:
select * from sales
where sale_id in (
select max(sale_id)
from sales
group by (product_code)
)