2016-01-01 8 views
1

Как извлечь данные из таблиц 3 с максимальной датойКак фильтровать данные на основе столбца даты?

select 
    c.model_key, v.id, v.category_Id, v.Text1, v.Numeric1, 
    c.Name, fx.Currency_code, fx.Rate, fx.effective_dt 
from 
    aps.v_m_fxrates fx 
join 
    aps.t_m_value v on fx.Currency_code = v.Text1 
join 
    aps.t_m_category c on v.Category_Id = c.Id 
where 
    c.Name = 'FXRates' 
    and c.Model_Key = 25 
    and v.Text1 = fx.Currency_code 
    and fx.version = 2 

Используя приведенный выше запрос, я получаю результаты, но результаты появляются для всех в effective_dt. Вместо этого мне нужно выбрать только записи с последними effective_dt. В приведенном ниже изображении есть 2 записи с AED, в которых дата с последней датой - 1999-03-31, которая должна быть возвращена. После этого я не знаю, как действовать дальше и фильтровать результат для достижения результата.

Я также попытался это

select 
    c.model_key, v.id, v.category_Id, v.Numeric1, 
    c.Name, fx.Currency_code, fx.Rate, fx.effective_dt 
from 
    aps.v_m_fxrates fx 
join 
    aps.t_m_value v on fx.Currency_code = v.Text1 
join 
    aps.t_m_category c on v.Category_Id = c.Id 
where 
    c.Name = 'FXRates' 
    and c.Model_Key = 25 
    and v.Text1 = fx.Currency_code 
    and fx.version = 2 
    and fx.effective_dt in (select MAX(effective_dt) 
          from aps.v_m_fxrates) 

но ничего не возвращается.

Фактический выход:

Actual Outcome

Ожидаемые результаты:

enter image description here

ответ

1

Используйте row_number() функции в подзапрос, как это:

select 
    c.model_key, v.id, v.category_Id, v.Text1, v.Numeric1, 
    c.Name, fx.Currency_code, fx.Rate, fx.effective_dt 
from (
    select 
     Currency_code,Rate,effective_dt 
     ,SeqNo = row_number() over (partition by Currency_code order by effective_dt desc) 
    from aps.v_m_fxrates 
    where version = 2 
) fx 
join 
    aps.t_m_value v on fx.Currency_code = v.Text1 
join 
    aps.t_m_category c on v.Category_Id = c.Id 
where c.Name = 'FXRates' 
    and c.Model_Key = 25 
    and v.Text1 = fx.Currency_code 
    and fx.SeqNo = 1 
+0

работал на меня.Спасибо! – sujai

0

оператор Использование Попытка ТОП 1 и соответствующие ORDER BY

Для exampl e:

SELECT TOP 1 C.model_key, 
      V.id, 
      ... 
FROM ... 
ORDER BY FX.effective_dt DESC 

Другой вариант, который у вас есть, заключается в использовании функции агрегата и корреляции в условии where.

select C.model_key, 
     V.id, 
     V.category_Id, 
     V.Text1, 
     V.Numeric1, 
     C.Name, 
     FX.Currency_code, 
     FX.Rate, 
     FX.effective_dt 
FROM aps.v_m_fxrates AS FX 
    JOIN aps.t_m_value AS V on FX.Currency_code = V.Text1 
    JOIN aps.t_m_category AS C on V.Category_Id = C.Id 
WHERE C.Name = 'FXRates' 
      AND C.Model_Key = 25 
      AND FX.version = 2 
      AND FX.effective_dt = 
       (SELECT MAX(effective_dt) FROM aps.v_m_fxrates AS FX2 
       WHERE FX2.currency_code = FX.currency_code) 
+0

ваш второй вариант кажется правильным задача .my требует что-то связанное с коррелированных подзапросов .Но этого вмятина работы для меня. весь результат внешнего запроса должен быть во внутреннем запросе, чтобы получить требуемый результат. но этот внутренний запрос будет сравнивать только одну запись? – sujai

+0

Во внутреннем запросе вы выбираете max effective_dt для кода валюты из внешнего запроса. Таким образом, записи с max effective_dt для каждого кода валюты перейдут в таблицу результатов. Я думаю, что ваша проблема может быть в дополнительных операциях объединения, которые могли бы фильтровать строки. Поэтому попробуйте добавить два внутренних соединения к внутреннему запросу. – fabulaspb

0
select 
    c.model_key, v.id,v.category_Id, v.Numeric1, 
    c.Name, fx.Currency_code, fx.Rate, fx.effective_dt 
from 
    aps.v_m_fxrates fx 
join 
    aps.t_m_value v on fx.Currency_code = v.Text1 
join 
    aps.t_m_category c on v.Category_Id = c.Id 
where 
    c.Name = 'FXRates' 
    and c.Model_Key = 25 
    and v.Text1 = fx.Currency_code 
    and fx.version = 2 
    and fx.effective_dt = (select MAX(effective_dt) from aps.v_m_fxrates) 

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

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