Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 访问并选择最新的行_Sql_Ms Access_Subquery - Fatal编程技术网

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
                     );