Найти ближайшую дату в SQL Server

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

27
задан nbrooks 24 December 2012 в 15:42
поделиться

1 ответ

У меня есть лучшее решение этой проблемы, я думаю.

Я покажу несколько изображений, чтобы поддержать и объяснить окончательное решение.

Фон В моем решении у меня есть таблица курсов валют. Они представляют рыночные курсы для разных валют. Однако у нашего поставщика услуг возникли проблемы с подачей тарифов, поэтому некоторые тарифы имеют нулевые значения. Я хочу заполнить недостающие данные курсами для той же валюты, которые как можно ближе по времени к отсутствующему курсу. В основном я хочу получить RateId для ближайшей ненулевой ставки, которую я затем заменю. (Это не показано здесь в моем примере.)

1) Итак, для начала давайте определим информацию о пропущенных ставках:

Запрос, показывающий мои пропущенные ставки т. е. имеют значение скорости, равное нулю

2) Далее давайте определим скорости, которые не пропущены. Запрос, показывающий скорости, которые не пропущены.

3) В этом запросе происходит волшебство. Здесь я сделал предположение, которое можно удалить, но которое было добавлено для повышения эффективности / производительности запроса. Предположение в строке 26 состоит в том, что я ожидаю найти замещающую транзакцию в тот же день, что и транзакция с отсутствующим / нулевым значением. Волшебство происходит в строке 23: функция Row_Number добавляет автоматический номер, начинающийся с 1, для кратчайшей разницы во времени между отсутствующей и отсутствующей транзакцией. Следующая ближайшая транзакция имеет значение rownum 2 и т. Д.

Обратите внимание, что в строке 25 я должен объединить валюты, чтобы не нарушать типы валют. То есть я не хочу заменять валюту AUD значениями CHF. Я хочу самые близкие совпадающие валюты.

Объединение двух наборов данных с row_number для идентификации ближайшей транзакции

4) Наконец, давайте получим данные, где RowNum равен 1 Окончательный вариант query

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

    ; with cte_zero_rates as
(
        Select      * 
        from        fxrates
        where       (spot_exp = 0 or spot_exp = 0) 
),
cte_non_zero_rates as
(
        Select      * 
        from        fxrates
        where       (spot_exp > 0 and spot_exp > 0) 
)
,cte_Nearest_Transaction as
(
        select       z.FXRatesID    as Zero_FXRatesID
                    ,z.importDate   as Zero_importDate
                    ,z.currency     as Zero_Currency
                    ,nz.currency    as NonZero_Currency
                    ,nz.FXRatesID   as NonZero_FXRatesID
                    ,nz.spot_imp
                    ,nz.importDate  as NonZero_importDate
                    ,DATEDIFF(ss, z.importDate, nz.importDate) as TimeDifferece
                    ,ROW_NUMBER() Over(partition by z.FXRatesID order by abs(DATEDIFF(ss, z.importDate, nz.importDate)) asc) as RowNum
        from        cte_zero_rates z 
        left join   cte_non_zero_rates nz on nz.currency = z.currency
                    and cast(nz.importDate as date) = cast(z.importDate as date)
        --order by  z.currency desc, z.importDate desc
)
select           n.Zero_FXRatesID
                ,n.Zero_Currency
                ,n.Zero_importDate
                ,n.NonZero_importDate
                ,DATEDIFF(s, n.NonZero_importDate,n.Zero_importDate) as Delay_In_Seconds
                ,n.NonZero_Currency
                ,n.NonZero_FXRatesID
 from           cte_Nearest_Transaction n
 where          n.RowNum = 1
                and n.NonZero_FXRatesID is not null
 order by       n.Zero_Currency, n.NonZero_importDate
0
ответ дан Craig Gers 24 December 2012 в 15:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: