Сохраненная процедура SQL - попытка различать по дате и оператору if

У меня есть список обменных курсов, классифицированных по валютам, и мне нужно как-то опубликовать разницу в стоимости.

Например:

  • фунт стерлингов к доллару | дата захвата: 23.02.12 | значение: 5
  • фунт стерлингов к доллару | дата захвата: 22.02.12 | значение: 3
  • фунт стерлингов к доллару | дата захвата: 21.02.12 | значение: 3

Я хочу, чтобы это произошло; когда запрос выполняется, он автоматически определяет последнюю дату, которая была сделана, сравнивает ее с предыдущей датой и отправляет обратно значение, чтобы сказать, было ли это увеличение, то есть если увеличение, то "^", если уменьшение "v" , если это же "‹->".

Мой текущий запрос может вывести последнюю полученную дату, но мне все равно нужно выполнить подзапрос, чтобы получить вторую последнюю дату и значение, а затем опубликовать оператор if.

Правильно ли я лаю своим методом?

Вот мой код.

SELECT
distinct t.source_currency_code, t.target_currency_code,
t.entry_no as entry_no,
'(' + t.source_currency_code + ') '  + s.currency_name as source_currency_name, 
'(' + t.target_currency_code + ') '  + x.currency_name as target_currency_name,
t.value_amount as value_amount,
t.uplift_percent as uplift,
t.date_loaded as date_loaded

from texchange_rate t, tcurrency s, tcurrency x

where 
s.currency_code = t.source_currency_code and 
x.currency_code = t.target_currency_code and
t.date_loaded in 
      (
          SELECT max(date_loaded) from texchange_rate tt
          where t.source_currency_code = tt.source_currency_code 
          and t.target_currency_code = tt.target_currency_code
      )

order by source_currency_code, target_currency_code


SELECT
distinct t.source_currency_code, t.target_currency_code,
t.entry_no as entry_no,
'(' + t.source_currency_code + ') '  + s.currency_name as source_currency_name, 
'(' + t.target_currency_code + ') '  + x.currency_name as target_currency_name,
t.value_amount as value_amount,
t.uplift_percent as uplift,
t.date_loaded as date_loaded2

from texchange_rate t, tcurrency s, tcurrency x

where 
s.currency_code = t.source_currency_code and 
x.currency_code = t.target_currency_code and
t.date_loaded in 
       (
          SELECT max(date_loaded) from texchange_rate tt
          where t.source_currency_code = tt.source_currency_code
          and t.target_currency_code = tt.target_currency_code
      )
    and
      t.value_amount in 
      (
          SELECT value_amount from texchange_rate tt
          where DATEDIFF(day, date_loaded, getdate()) < date_loaded
            and t.source_currency_code = tt.source_currency_code
            and t.target_currency_code = tt.target_currency_code
      )

order by source_currency_code, target_currency_code

Некоторые примерные данные:

4366    GBP USD 15986   23/01/2012 13:42:02
4337    GBP USD 15600   17/10/2011 12:37:58
4312    GBP USD 15500   22/08/2011 14:00:01
4287    GBP USD 15500   21/08/2011 14:00:01

person Rexxo    schedule 24.02.2012    source источник
comment
Кратко, да. Вы захотите получить последнее значение и вернуться к тому же источнику, где максимальная дата! = дата последнего значения. Или вы можете рекурсивно найти все пары различий и взять последнюю. Было бы полезно иметь образцы данных из каждой таблицы или, по крайней мере, определение каждой из них.   -  person sorpigal    schedule 24.02.2012
comment
Хм, хорошо. Я отредактировал некоторые образцы данных в своем первоначальном посте, потому что я не могу сделать это четко в поле ответа.   -  person Rexxo    schedule 24.02.2012


Ответы (2)


В качестве альтернативы вы можете попробовать вариант принятого ответа на ваш предыдущий вопрос:

select source_currency_code, 
       target_currency_code,
       max(source_currency_name) source_currency_name, 
       max(target_currency_name) target_currency_name,
       max(case when rn = 1 then value_amount end) value_amount,
       max(case when rn = 1 then uplift end) uplift,
       max(case when rn = 1 then date_loaded end) date_loaded,
       case sign(max(case when rn = 1 then value_amount end) - 
                 max(case when rn = 2 then value_amount end))
           when 1 then '^'
           when 0 then '<->'
           when -1 then 'v'
       end change_over_previous
from 
(select t.source_currency_code, 
        t.target_currency_code,
        '('+t.source_currency_code+') '  + s.currency_name as source_currency_name, 
        '('+t.target_currency_code+') '  + x.currency_name as target_currency_name,
        t.value_amount as value_amount,
        t.uplift_percent as uplift,
        t.date_loaded as date_loaded,
        rank() over (partition by t.source_currency_code, 
                                  t.target_currency_code 
                     order by t.date_loaded desc) rn
 from texchange_rate t
 join tcurrency s on s.currency_code = t.source_currency_code 
 join tcurrency x on x.currency_code = t.target_currency_code) v
where rn in (1, 2)
group by source_currency_code, target_currency_code
order by source_currency_code, target_currency_code
person Community    schedule 24.02.2012
comment
Вы, сэр, гений. Как ты так хорош в этом?! Я вернулся к вашему методу, но мое решение, которое я пытался использовать, заключалось в публикации результатов в новой таблице с отдельными полями, а затем и в операторе if, обрабатывающем разницу результатов. Еще раз спасибо, это очень ценно! - person Rexxo; 24.02.2012
comment
Отстой! Рад, что смог помочь. :) - person ; 24.02.2012

;WITH ExchangeCTE AS
(   SELECT  *, ROW_NUMBER() OVER(PARTITION BY source_currency_code, target_currency_code ORDER BY date_loaded DESC) [RowNum]
    FROM    texchange_rate
)
SELECT  a.source_currency_code, 
        a.target_currency_code,
        a.entry_no AS entry_no,
        '(' + a.source_currency_code + ') '  + s.currency_name AS source_currency_name, 
        '(' + a.target_currency_code + ') '  + t.currency_name AS target_currency_name,
        a.value_amount AS value_amount,
        a.uplift_percent AS uplift,
        a.date_loaded AS date_loaded2,
        b.value_amount AS Previous_Value_Amount,
        CASE WHEN a.value_amount > b.value_amount THEN '^'
            WHEN a.value_amount = b.value_amount THEN '<->'
            ELSE 'v'
        END AS [Symbol]
FROM    ExchangeCTE a
        INNER JOIN ExchangeCTE b
            ON a.source_currency_code = b.source_currency_code 
            AND a.target_currency_code = b.target_currency_code
            AND a.RowNum = b.RowNum - 1 -- PREVIOUS RECORD
        INNER JOIN tcurrency s
            ON a.source_currency_code = S.currency_code 
        INNER JOIN tcurrency t
            ON a.target_currency_code = S.currency_code  
WHERE   a.RowNum = 1 -- LATEST RECORD

Не обязательно иметь WHERE a.RowNum = 1, без этого он просто вернет все записи с их предыдущим значением рядом с ними.

person GarethD    schedule 24.02.2012