访问选择最大日期的条件查询

时间:2015-12-21 14:32:42

标签: excel vba ms-access access-vba

我正在使用如下所示的数据集:

 ZeroCurveID  MarkRunID  MarkAsOfDate
    90-6589      6656       2/28/2012
    90-6589      6656       2/28/2012
    90-6589      6656       2/28/2012
    14-8898      8898       8/12/2014
    14-8898      8898       8/12/2014
    14-8898      8898       8/12/2014
    14-8898      8898       8/6/2014
    14-8898      8898       8/6/2014
    14-8898      8898       8/12/2014
    14-8898      8898       8/12/2014
    14-8898      8898       8/12/2014
    14-8898      8898       8/12/2014
    14-8898      8898       8/12/2014

对于给定的ZeroCurveID和MarkRunID,应该只有一个MarkAsofDate。因此,对于ZeroCurveID = 14-8898和MarkRunID = 8898,MarkAsofDate必须等于8/12/2014,并且任何其他值都不正确。

在某些情况下,我有两个相同MarkRunID和ZeroCurveID的MarkAsofDate值。我想创建一个查询来识别这些实例何时发生,并选择较大的MarkAsofDate值作为正确的值。如何设计Query或VBA子程序来执行此操作?

1 个答案:

答案 0 :(得分:1)

以下SQL语句返回存在多个 MarkAsOfDates的ZeroCurveID和MarkRunID的所有组合,以及最大MarkAsOfDate:

SELECT ZeroCurveID, MarkRunID, MAX(MarkAsOfDate)
FROM t
GROUP BY ZeroCurveID, MarkRunID
HAVING COUNT(*) > 1

这会选择实际上具有不同 MarkAsOfDates的所有组合,但它不会告知最大日期:

SELECT ZeroCurveID, MarkRunID, COUNT(DISTINCT MarkAsOfDate) AS nDups
FROM t
GROUP BY ZeroCurveID, MarkRunID
HAVING nDups > 1

在性能方面,最好先使用上述SQL之一获取实际需要更正的条目列表,然后单独更新它们(使用参数@zcid和{{1} }):

@mrid

否则,您可以使用这个大型SQL语句一次性完成所有操作:

UPDATE t
SET MarkAsOfDate = ( SELECT MAX(t2.MarkAsOfDate)
    FROM t AS t2
    WHERE t2.ZeroCurveID = t.ZeroCurveID AND
          t2.MarkRunID = t.MarkRunID )
WHERE ZeroCurveID = @zcid AND MarkRunID = @mrid