【问题标题】:Access select latest rows访问选择最新行
【发布时间】:2018-07-25 09:20:47
【问题描述】:

我希望通过一个步骤创建一个结果,该结果将为每个 Code 提供最新(前 1 个)ValidFrom 日期,

表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

使用Max(ValidFrom)Code 进行分组不起作用,因为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;

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

我可以通过添加WHERE 子句来单独显示每个Code

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)

我显然有很多关于子查询的知识要学习,但是任何人都可以在这里让我走上正确的道路。提前致谢。

【问题讨论】:

    标签: sql ms-access subquery


    【解决方案1】:

    我会使用相关子查询来做到这一点:

    select t1.*
    from table1 as t1
    where t1.validfrom = (select max(tt1.validfrom)
                          from table1 as tt1
                          where tt1.code = t1.code
                         );
    

    【讨论】:

    • 感谢 Gordon,只是对丢失的括号进行了小幅更正,但除此之外,太棒了!
    猜你喜欢
    • 2014-12-09
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多