Sql 访问并选择最新的行
我希望在一个步骤中创建一个结果,只提供每个Sql 访问并选择最新的行,sql,ms-access,subquery,Sql,Ms Access,Subquery,我希望在一个步骤中创建一个结果,只提供每个代码的最新(前1名)有效日期 表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 ValidF
代码的最新(前1名)有效日期
表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
在code
上使用Max(ValidFrom)
分组不起作用,因为Rate
对于每个ValidFrom
日期是不同的,所以每个记录都会返回
最简单的解决方案是创建一个临时查询(Query1):
然后使用Query2过滤结果:
SELECT Table1.Code, Table1.Rate, Table1.ValidFrom
FROM Query1 INNER JOIN Table1 ON (Query1.ValidFrom=Table1.ValidFrom) AND (Query1.Code=Table1.Code);
但这很混乱,因为它只需要一个查询1作为临时步骤,我想找到一个更整洁的方法
因此,我试图找出如何将Query1的SQL作为子查询包含到Query2中(因此引用了Sub1),但就是想不出来
作为替代解决方案,我尝试使用TOP 1类型查询(Query3):
这只会为每个代码生成一条记录,而不是一条记录
通过添加一个WHERE
子句,我可以让它单独显示每个code
SELECT TOP 1 Sub1.Code, Sub1.Rate, Sub1.ValidFrom
FROM Table1 AS Sub1
WHERE (((Sub1.Code)="C"))
ORDER BY Sub1.ValidFrom DESC;
因此,下一步尝试将其用作子查询,但也无法使其正常工作(查询4):
关于子查询,我显然有很多东西需要学习,但谁能让我走上正确的道路呢。提前感谢。我会用一个相关的子查询:
select t1.*
from table1 as t1
where t1.validfrom = (select max(tt1.validfrom)
from table1 as tt1
where tt1.code = t1.code
);
我将使用相关子查询执行此操作:
select t1.*
from table1 as t1
where t1.validfrom = (select max(tt1.validfrom)
from table1 as tt1
where tt1.code = t1.code
);
谢谢Gordon,只是对缺少的括号做了一个小小的更正,但除此之外,太棒了!谢谢Gordon,只是对缺少的括号做了一个小小的更正,但除此之外,太棒了!
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)
select t1.*
from table1 as t1
where t1.validfrom = (select max(tt1.validfrom)
from table1 as tt1
where tt1.code = t1.code
);