2016-05-18 8 views
0

Я пытаюсь использовать функцию MAX() как подзапрос, чтобы фильтровать результаты моего большего запроса за последние пару лет. Я понял, что это было немного сложнее, чем то, что я изначально считал нужным, поэтому я создал гораздо более простой запрос, чтобы проверить, что мне нужно делать с предложением HAVING, чтобы заставить его работать.SQL-HAVING Раздел Проблема

Я проверил эти две должности, но это не помогло (SQL, HAVING clause explained, SQL: HAVING clause)

Я не думаю, что мое понимание пункта HAVING правильно, потому что я не знаю, почему это не работает , Кто-нибудь сможет помочь и объяснить?

Примечание: [Fiscal Year] - NVARCHAR, поэтому я решил преобразовать его в INT.

SELECT DISTINCT 

D.[FISCAL YEAR] 

FROM [Dates] AS D 

GROUP BY D.[Fiscal Year] 

HAVING CONVERT(INT,D.[Fiscal Year]) >= MAX(CONVERT(INT,D.[FISCAL YEAR])) -2 

Это мои результаты:

(No column name) 
2015 
2014 
2013 
2012 
2016 

Эти результаты я должен получить:

(No column name) 
2015 
2014 
2016 
+1

Почему бы не использовать Где заявление вместо этого? –

ответ

2

Я думаю, что это можно было бы сделать лучше в пункте WHERE. Это решение не оптимально, но вот что вы можете сделать.

SELECT 
     DISTINCT D.[FISCAL YEAR] 
FROM [Dates] AS D 
     WHERE CONVERT(INT,d.[Fiscal Year]) 
      >= (SELECT MAX(CONVERT(INT,[Fiscal Year])) -2 from Dates) 
1

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

Вот один вариант использования window functions:

select distinct fiscalyear 
from (
    select fiscalyear, max(fiscalyear) over() maxfiscalyear 
    from dates 
) t 
where fiscalyear >= maxfiscalyear - 2 

Я не вижу необходимости использовать функцию convert здесь либо, но если вам нужно, вы можете добавить его обратно.

+0

Спасибо за объяснение! – plankton

Смежные вопросы