访问select最大date的条件查询

我正在处理一个如下所示的数据集:

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必须等于2014年8月12日,其他值不正确。

在某些情况下,对于相同的MarkRunID和ZeroCurveID,我有两个MarkAsofDate值。 我想要创build一个查询来识别这些实例何时发生,并select较大的MarkAsofDate值作为正确的值。 我怎样才能devise一个查询或VBA子程序来做到这一点?

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

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

这select所有组合实际上有不同的 MarkAsOfDates,但它不会告诉最大date:

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

在性能方面,首先使用上面的SQL之一来获取实际需要更正的条目列表,然后单独更新它们(使用参数@zcid@mrid )可能会更好:

 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 

否则,你可以用这个大的SQL语句一次完成这个工作:

 UPDATE t SET MarkAsOfDate = ( SELECT MAX(t2.MarkAsOfDate) FROM t AS t2 WHERE t2.ZeroCurveID = t.ZeroCurveID AND t2.MarkRunID = t.MarkRunID ) WHERE 1 < ( SELECT COUNT(DISTINCT t3.MarkAsOfDate) FROM t AS t3 WHERE t3.ZeroCurveID = t.ZeroCurveID AND t3.MarkRunID = t.MarkRunID )