Необходимо извлечь последнюю вставленную / обновленную запись таблицы с некоторыми исключениями - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь получить последнюю запись, вставленную / обновленную в таблицу SHIPMENT_EVENT.Есть пара таких событий / кодов, которые не нужны, например, все начинаются с '9'.Проблема в том, что эти события всегда отправляются последними, но они наименее важны для меня, поэтому мне нужно отобразить последнее событие, но если это событие 9X, то оно не должно отображаться, вместо этого оно должно продолжать искатьдля последнего события, которое не 9X до достижения действительного кода для показа.

Вот код, который, как я думал, помогал моему делу.Это левое соединение должно проверить таблицу событий и извлечь последнее событие.Тем не менее, тестирование показало, что вместо этого показывается NULL, когда последнее событие было 9X.

Я попытался переместить предложение NOT LIKE по окружности за пределы первого блока, но с тем же результатом.Я заметил, что это было неправильно, когда я удалял не как, я закончил со всеми результатами с событием 9X.

left join 

(    select ship_id, ship_to_loc_cd856, ship_evnt_cd, updt_job_tms, 
carr_tracking_num, event_srv_lvl
         FROM
         (   select  ship_id, ship_to_loc_cd856, ship_evnt_cd, 
updt_job_tms, carr_tracking_num, event_srv_lvl
            ,        row_number() over(partition by ship_id order by 
updt_job_tms desc) as RN
          FROM     shipment_event
         ) s
         WHERE RN = 1  and ship_evnt_cd not like ('9%')
        )  AS lscus
ON        scus.ship_id=lscus.ship_id and 
scus.ship_to_loc_code=lscus.ship_to_loc_cd856

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

Спасибо

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Если у вас есть ship_id s, которые имеют только 9% события, вам понадобится, например,

select  ship_id, ship_to_loc_cd856, ship_evnt_cd
,     updt_job_tms, carr_tracking_num, event_srv_lvl
,     row_number() over(partition by ship_id order by updt_job_tms desc) as RN
FROM    shipment_event e
WHERE   ship_evnt_cd not like '9%'
    OR  NOT EXISTS (SELECT 1 from shipment_event s 
                    WHERE s.ship_id = e.ship_id 
                     AND ship_evnt_cd not like '9%')

в качестве вашего дополнительного выбора

0 голосов
/ 25 января 2019

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

WHERE RN = 1  and ship_evnt_cd not like ('9%')

Сначала нужно отфильтровать и получить самую последнюю строку из оставшихся:

LEFT JOIN (SELECT ship_id, ship_to_loc_cd856, ship_evnt_cd, 
                  updt_job_tms, carr_tracking_num, event_srv_lvl, 
                  ROW_NUMBER() OVER(PARTITION BY ship_id ORDER BY updt_job_tms DESC) AS rn
           FROM Shipment_Event
           -- This _might_ perform better than the NOT LIKE condition, you'll need to test
           WHERE LEFT(ship_evnt_cd, 1) <> '9') lscus
       ON lscus.ship_id = scus.ship_id 
          AND lscus.ship_to_loc_cd856 = scus.ship_to_loc_code 
          AND lscus.rn = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...