2015-12-21 56 views
0

我有一個數據集,看起來像這樣的工作:條件查詢,選擇最多的日期

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值。我想要創建一個查詢來識別這些實例何時發生,並選擇較大的MarkAsofDate值作爲正確的值。我怎樣才能設計一個查詢或VBA子程序來做到這一點?

回答

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@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)