2015-12-21 5 views
0

Я работаю с набором данных, который выглядит следующим образом:Условный запрос в Access выбрать Max Дата

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, а любые другие значения неверны.

В некоторых случаях у меня есть два значения MarkAsofDate для тех же MarkRunID и ZeroCurveID. Я хочу создать запрос для определения, когда возникают эти экземпляры, и выбрать большее значение MarkAsofDate в качестве правильного значения. Как я могу создать подпрограмму Query или VBA для этого?

ответ

1

Следующая SQL оператор возвращает все комбинации ZeroCurveID и MarkRunID, для которых множественных существуют MarkAsOfDates, наряду с максимальным 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 

Поведение, возможно, было бы лучше сначала использовать один из вышеуказанных SQLs, чтобы получить список записей, которые на самом деле должны быть исправлены, а затем обновлять их по отдельности (с использованием параметров @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) 
Смежные вопросы