Sql 在价目表中查找最新价格

Sql 在价目表中查找最新价格,sql,vba,ms-access,Sql,Vba,Ms Access,我有一个表,有Item、Price和Price-Date列。我需要做的是只过滤掉旧的价格,只显示每个项目的最新价格。我使用的是MS Access 2007,需要参考我正在编写的一些VBA中最新的价格,在我的研究中,我找不到一种方法来编程访问数据透视表数据,以便在数据库中的其他地方为客户定价 例子: 桌子 项目|价格|价格日期您可以使用相关子查询: select t.* from t where t.pricedate = (select max(t2.pricedate)

我有一个表,有Item、Price和Price-Date列。我需要做的是只过滤掉旧的价格,只显示每个项目的最新价格。我使用的是MS Access 2007,需要参考我正在编写的一些VBA中最新的价格,在我的研究中,我找不到一种方法来编程访问数据透视表数据,以便在数据库中的其他地方为客户定价

例子: 桌子


项目|价格|价格日期

您可以使用相关子查询:

select t.*
from t
where t.pricedate = (select max(t2.pricedate)
                     from t as t2
                     where t2.item = t.item
                    );

一个选项使用子查询查找每个项目的最新价格:

SELECT t1.Item, t1.Price, t1.PriceDate
FROM yourTable t1
WHERE t1.PriceDate = (SELECT MAX(t2.PriceDate) FROM yourTable t2 WHERE t2.Item = t1.Item);

这比使用MAX函数更有效:

SELECT Item, Price, PriceDate
FROM customer_pricing t1
WHERE NOT EXITS(
    SELECT *
    FROM customer_pricing t2
    WHERE t1.item = t2.item
    AND t1.PriceDate < t2.PriceDate
)

这个解决方案是由@dewey提出的,是

SELECT t1.item, t1.unit_price1, t1.effect_date, t1.site_ref
FROM dbo_itemprice_mst_all AS t1
WHERE (((t1.site_ref)="MED" Or (t1.site_ref)="CRD") AND ((Exists (SELECT *
    FROM dbo_itemprice_mst_all t2
    WHERE t1.item = t2.item
    AND t1.effect_date < t2.effect_date
    ))=False))
ORDER BY t1.item;

样本数据和所需结果将有助于在此选择dbo_itemprice_mst_all.*从dbo_itemprice_mst_all.effect_date=选择maxdbo_itemprice_mst_all.effect_日期从dbo_itemprice_mst_all作为dbo_itemprice_mst_all.itemprice_mst_all.item=dbo_itemprice_mst_all.itemprice_mst_all.itemprice_;我使用了上面的方法,它只返回两行。也许我搞错了什么,更新了帖子以包含代码。你的代码1看起来很像这个代码,而代码2与你问题中的数据不匹配。谢谢。这解决了问题,而且速度很快。@dewey。你有证据表明这比使用max更快吗?花点时间读一读:如果一个答案解决了你的问题,你应该点击左边的复选标记接受它。