我正在使用如下所示的数据集:
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子程序来执行此操作?
答案 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