【发布时间】: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)
我显然有很多关于子查询的知识要学习,但是任何人都可以在这里让我走上正确的道路。提前致谢。
【问题讨论】: