我要问你一个困扰我一段时间的问题。
我有这个数据库,注册一个商店的每笔交易,列如下:
产品代码对于每个商品都是唯一的(基本上是条形码),我想为查询中提供的每个product_code提取最新销售,因此,我们有“ P914”,“ P959”和“输入为“ P953”,输出应为:
因此,我一直在尝试两种方法来获得此结果,第一种方法是使用简单的max()函数并通过group by:
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, CODE_AP
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 code_ap)
order by d_realisation desc;
两个查询都给出完全相同的结果:
我真的无法捕捉到我在做错什么,以及如何正确地做。如果有人可以帮助我,我将不胜感激
谢谢大家阅读!
您按sale_id +供应商+代码分组,因此您将获得每个sale / vendor / code组合的最后一条记录,而不是每个sale_id的最后一条记录。
修复,仅按产品代码分组:
假设ID与您的示例中的sale_dates顺序相同:
select * from sales
where sale_id in (
select max(sale_id)
from sales
group by (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
)