访问选择最新行

时间:2018-02-14 17:49:02

标签: sql ms-access subquery

我希望在一个步骤中创建一个结果,只为每个ValidFrom提供最新的(前1个)Code日期,

表1

Code    Rate    ValidFrom
A       0%      1/1/2018
B       20%     1/2/2018
A       20%     1/3/2018
A       10%     1/1/2017
B       5%      1/2/2017
C       30%     1/3/2016

查询结果为以下输出:

Code    Rate    ValidFrom
B       20%     1/2/2018
A       20%     1/3/2018
C       30%     1/3/2016

使用CodeMax(ValidFrom)进行分组并不起作用,因为每个Rate日期的ValidFrom不同,因此会返回每条记录。

最简单的解决方案是创建临时查询(Query1):

SELECT Sub1.Code, Max(Sub1.ValidFrom) AS ValidFrom
FROM Table1 AS Sub1
GROUP BY Sub1.Code;

然后使用Query2过滤结果:

SELECT Table1.Code,  Table1.Rate, Table1.ValidFrom
FROM Query1 INNER JOIN Table1 ON (Query1.ValidFrom=Table1.ValidFrom) AND (Query1.Code=Table1.Code);

但这很麻烦,因为它只需要一个Query1作为临时步骤,我想找到一个更整洁的方法。

所以,我试图找出如何将Query1的SQL作为子查询包含在Query2中(因此引用Sub1),但只是无法弄清楚。

作为替代解决方案,我尝试使用TOP 1类型查询(Query3):

SELECT TOP 1 Sub1.Code, Sub1.Rate, Sub1.ValidFrom
FROM Table1 AS Sub1
ORDER BY Sub1.ValidFrom DESC;

这只会为每个代码生成一条记录而不是一条记录。

我可以通过添加Code子句

来单独显示每个WHERE
SELECT TOP 1 Sub1.Code, Sub1.Rate, Sub1.ValidFrom
FROM Table1 AS Sub1
WHERE (((Sub1.Code)="C"))
ORDER BY Sub1.ValidFrom DESC;

所以接下来尝试将其用作子查询但不能正常工作(Query4):

SELECT Table1.Code, Table1.ValidFrom, Table1.Rate
FROM Table1
WHERE 
(SELECT TOP 1 Sub1.Rate
FROM Table1 AS Sub1
WHERE (((Sub1.Code)=Table1.Code))
ORDER BY Sub1.ValidFrom DESC)

我显然对子查询有很多了解,但是有人可以把我放在正确的轨道上。提前谢谢。

1 个答案:

答案 0 :(得分:2)

我会使用相关子查询来执行此操作:

$("#jplayer_id").bind($.jPlayer.event.ready, function(event) { 
        // do stuff
});