2013-06-10 2 views
0

У меня есть следующий запрос:мин с более, без группы по: возвращает неожиданные результаты

SELECT  ContractNr 
,   SequenceNr 
,   DurationBeginDate 
,   MIN(DurationBeginDate) OVER(PARTITION BY contractnr ORDER BY SEQUENCENR ASC) mindurdat 
FROM  AccountContract 
WHERE  ContractNr = 768 

, который возвращает следующий результат:

ContractNr SequenceNr DurationBeginDate   mindurdat 
768   1   2008-03-08 00:00:00.0000000 2008-03-08 00:00:00.0000000 
768   2   2008-06-08 00:00:00.0000000 2008-03-08 00:00:00.0000000 
768   3   2008-09-08 00:00:00.0000000 2008-03-08 00:00:00.0000000 
768   4   2008-12-08 00:00:00.0000000 2008-03-08 00:00:00.0000000 
768   5   2007-06-08 00:00:00.0000000 2007-06-08 00:00:00.0000000 

, который не то, что я ожидал, что я хочу для поля mindurdat - DurationBeginDate, соответствующий самому нижнему SequenceNr. Другими словами, для всех этих записей это должно быть 2008-03-08 00:00:00.0000000 Я не понимаю, почему последняя запись в этом примере хранит оригинал DurationBeginDate.

Я знаю, что могу получить правильный результат с подзапросом, но я хотел бы сохранить эффективность.

ответ

0

Когда вы используете заказ в сумме, min, max и т. Д., Вы получаете запущенный агрегат. Таким образом, он делает то, для чего он предназначен. Вы можете делать то, что хотите, с подзапросом или соединением:

-- Join 
SELECT 
    ac.ContractNr 
    , ac.SequenceNr 
    , ac.DurationBeginDate 
    , ao.DurationBeginDate FirstDurationBegin 
FROM 
    AccountContract ac 
LEFT JOIN 
    accountcontract ao 
    ON 
     ao.contractnr = ac.contractnr 
     AND 
     ao.sequencenr = 1 
WHERE 
    ac.ContractNr = 768 

-- outer apply 
SELECT 
    ac.ContractNr 
    , ac.SequenceNr 
    , ac.DurationBeginDate 
    , aor.DurationBeginDate FirstDurationBegin 
FROM 
    AccountContract ac 
OUTER APPLY 
    (
     SELECT 
      ao.DurationBeginDate 
     FROM 
      AccountContract ao 
     WHERE 
      ao.contractnr = ac.contractnr 
      AND 
      ao.sequencenr = 1 
    ) aor 
WHERE 
    ac.ContractNr = 768 
+0

О, я вижу, это имеет смысл сейчас. благодаря – HoneyBadger