powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Хранимая процедура. Merge записей
6 сообщений из 6, страница 1 из 1
Хранимая процедура. Merge записей
    #39339929
Kovach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!
Прошу помощи в написании хранимой процедуры
Суть вот какая:
есть таблица TROUBLE_TICKET_HISTORY_DIM с полями
TRBL_TCKT_KEY INTEGER 10
TRBL_TCKT_VER_KEY INTEGER 10
ISS_TCKT_ID CHAR 15
TCKT_CLOSED_TMS TIMESTAMP 26
IMPLMTN_SLA_IND CHAR 6
INCDNT_NTFYCN_SLA_IND CHAR 6
TCKT_UPDTD_TMS TIMESTAMP 26
OUTAGE_NTFYCN_SLA_IND CHAR 6
STAT_DESC CHAR 40
DVC_QA_SLA_IND CHAR 6
PRIORTY_DESC CHAR 10
SVRTY_CD CHAR 4
SSDM_EFFCTV_TMS TIMESTAMP 26
SSDM_EXPIRD_TMS TIMESTAMP 26
SSDM_CURR_IND CHAR 1

Пример:

4 записи.SSDM_EFFCTV_TMS, SSDM_EXPIRD_TMS, SSDM_CURR_IND, TCKT_UPDTD_TMS не учитывается в сравнении. записи должны сравниваться так:
по возрастанию TRBL_TCKT_VER_KEY, т.е. 1я сравнивается со 2й. они разные, значит остаются и 1я и 2я.
Далее 2я с 3ей. они одиниковы, значит удаляем запись с версией 3. остается только версия 2, у которой SSDM_EFFCTV_TMS остается свой, а SSDM_EXPIRD_TMS из версии 3. SSDM_CURR_IND = Y если есть хоть один Y в 2 и 3 версии.
Далее сравнивается 2 и 4, они разные, оставляем
по итогу получаем записи с версиями 1,2,4
...
Рейтинг: 0 / 0
Хранимая процедура. Merge записей
    #39340137
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kovach,

"В лоб" - в зависимости от того, что Вам нужно - сделать выборку или модифицировать исходную таблицу:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
with t1 as(
 select ROW_NUMBER() OVER(PARTITION BY TRBL_TCKT_KEY
                                      ,ISS_TCKT_ID, TCKT_CLOSED_TMS, IMPLMTN_SLA_IND, INCDNT_NTFYCN_SLA_IND
                                      ,OUTAGE_NTFYCN_SLA_IND, STAT_DESC, DVC_QA_SLA_IND, PRIORTY_DESC, SVRTY_CD
                          ORDER BY TRBL_TCKT_VER_KEY) as RNUM
       ,t.* 
 from TROUBLE_TICKET_HISTORY_DIM t
)
select * from t1 where RNUM = 1 
order by id, ver;

delete from (           
 select ROW_NUMBER() OVER(PARTITION BY TRBL_TCKT_KEY
                                      ,ISS_TCKT_ID, TCKT_CLOSED_TMS, IMPLMTN_SLA_IND, INCDNT_NTFYCN_SLA_IND
                                      ,OUTAGE_NTFYCN_SLA_IND, STAT_DESC, DVC_QA_SLA_IND, PRIORTY_DESC, SVRTY_CD
                          ORDER BY TRBL_TCKT_VER_KEY) as RNUM
       ,t.*
 from TROUBLE_TICKET_HISTORY_DIM t
)
where RNUM <> 1;
...
Рейтинг: 0 / 0
Хранимая процедура. Merge записей
    #39340164
Kovach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CawaSPb, модифицировать таблицу
...
Рейтинг: 0 / 0
Хранимая процедура. Merge записей
    #39340187
Kovach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
with t1 as(
select ROW_NUMBER() OVER(PARTITION BY TRBL_TCKT_KEY
,ISS_TCKT_ID, TCKT_CLOSED_TMS, IMPLMTN_SLA_IND, INCDNT_NTFYCN_SLA_IND
,OUTAGE_NTFYCN_SLA_IND, STAT_DESC, DVC_QA_SLA_IND, PRIORTY_DESC, SVRTY_CD
ORDER BY TRBL_TCKT_VER_KEY) as RNUM
,t.*
from TROUBLE_TICKET_HISTORY_DIM t
)
select * from t1 where RNUM = 1
order by id, ver;

этот кусок кода сработал, как group by, просто сравнив 1 - 4 (убрав версию 4) и 2-3 (убрав 3)

не то, что нужно :(
...
Рейтинг: 0 / 0
Хранимая процедура. Merge записей
    #39340195
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KovachCawaSPb, модифицировать таблицу
Тогда, соответственно DELETE.

Оно разбивает записи на группы ("partitions") по совпадению TRBL_TCKT_KEY и списка сравниваемых полей. Внутри группы нумерует в порядке возрастания версии. Потом всё, что "не первая запись внутри группы", удаляет.
(Для одного TRBL_TCKT_KEY получается несколько групп по количеству уникальных "версий").
...
Рейтинг: 0 / 0
Хранимая процедура. Merge записей
    #39341028
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kovach
with t1 as(
select ROW_NUMBER() OVER(PARTITION BY TRBL_TCKT_KEY
,ISS_TCKT_ID, TCKT_CLOSED_TMS, IMPLMTN_SLA_IND, INCDNT_NTFYCN_SLA_IND
,OUTAGE_NTFYCN_SLA_IND, STAT_DESC, DVC_QA_SLA_IND, PRIORTY_DESC, SVRTY_CD
ORDER BY TRBL_TCKT_VER_KEY) as RNUM
,t.*
from TROUBLE_TICKET_HISTORY_DIM t
)
select * from t1 where RNUM = 1
order by id, ver;

этот кусок кода сработал, как group by, просто сравнив 1 - 4 (убрав версию 4) и 2-3 (убрав 3)

не то, что нужно :(
Да, невнимательно прочитал условие. Но, в общем, инструмент вам дали, дерзайте.

Можете в лоб реализовать логику в процедуре. Но это будет скорее всего неэффективно. Можете тоже "в лоб" использовать "аналитические функции". Там надо смотреть, что получается.

При необходимости "переносить значения" добавится использование LEAD или LAG. Примерно вот так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
update (
 select LEAD(ISS_TCKT_ID)            OVER(PARTITION BY TRBL_TCKT_KEY  ORDER BY TRBL_TCKT_VER_KEY) as next_ISS_TCKT_ID
       ,LEAD(TCKT_CLOSED_TMS)        OVER(PARTITION BY TRBL_TCKT_KEY  ORDER BY TRBL_TCKT_VER_KEY) as next_TCKT_CLOSED_TMS
       ,LEAD(IMPLMTN_SLA_IND)        OVER(PARTITION BY TRBL_TCKT_KEY  ORDER BY TRBL_TCKT_VER_KEY) as next_IMPLMTN_SLA_IND
       ,LEAD(INCDNT_NTFYCN_SLA_IND)  OVER(PARTITION BY TRBL_TCKT_KEY  ORDER BY TRBL_TCKT_VER_KEY) as next_INCDNT_NTFYCN_SLA_IND
       ,LEAD(OUTAGE_NTFYCN_SLA_IND)  OVER(PARTITION BY TRBL_TCKT_KEY  ORDER BY TRBL_TCKT_VER_KEY) as next_OUTAGE_NTFYCN_SLA_IND
       ,LEAD(STAT_DESC)              OVER(PARTITION BY TRBL_TCKT_KEY  ORDER BY TRBL_TCKT_VER_KEY) as next_STAT_DESC
       ,LEAD(DVC_QA_SLA_IND)         OVER(PARTITION BY TRBL_TCKT_KEY  ORDER BY TRBL_TCKT_VER_KEY) as next_DVC_QA_SLA_IND
       ,LEAD(PRIORTY_DESC)           OVER(PARTITION BY TRBL_TCKT_KEY  ORDER BY TRBL_TCKT_VER_KEY) as next_PRIORTY_DESC
       ,LEAD(SVRTY_CD)               OVER(PARTITION BY TRBL_TCKT_KEY  ORDER BY TRBL_TCKT_VER_KEY) as next_SVRTY_CD
       ,LAST_VALUE(SSDM_EXPIRD_TMS)  OVER(PARTITION BY TRBL_TCKT_KEY
                                                      ,ISS_TCKT_ID, TCKT_CLOSED_TMS, IMPLMTN_SLA_IND, INCDNT_NTFYCN_SLA_IND
                                                      ,OUTAGE_NTFYCN_SLA_IND, STAT_DESC, DVC_QA_SLA_IND, PRIORTY_DESC, SVRTY_CD
                                          ORDER BY TRBL_TCKT_VER_KEY) as last_SSDM_EXPIRD_TMS
       ,MAX(SSDM_CURR_IND)           OVER(PARTITION BY TRBL_TCKT_KEY
                                                      ,ISS_TCKT_ID, TCKT_CLOSED_TMS, IMPLMTN_SLA_IND, INCDNT_NTFYCN_SLA_IND
                                                      ,OUTAGE_NTFYCN_SLA_IND, STAT_DESC, DVC_QA_SLA_IND, PRIORTY_DESC, SVRTY_CD
                                          ORDER BY TRBL_TCKT_VER_KEY) as overall_SSDM_CURR_IND
       ,t.*
 from TROUBLE_TICKET_HISTORY_DIM t
)
set (SSDM_EXPIRD_TMS, SSDM_CURR_IND) = (last_SSDM_EXPIRD_TMS, overall_SSDM_CURR_IND)
where (
 ISS_TCKT_ID, TCKT_CLOSED_TMS, IMPLMTN_SLA_IND, INCDNT_NTFYCN_SLA_IND, OUTAGE_NTFYCN_SLA_IND, STAT_DESC, DVC_QA_SLA_IND, PRIORTY_DESC, SVRTY_CD, SSDM_EXPIRD_TMS
) = (
 next_ISS_TCKT_ID, next_TCKT_CLOSED_TMS, next_IMPLMTN_SLA_IND, next_INCDNT_NTFYCN_SLA_IND, next_OUTAGE_NTFYCN_SLA_IND, next_STAT_DESC, next_DVC_QA_SLA_IND
,next_PRIORTY_DESC, next_SVRTY_CD, next_SSDM_EXPIRD_TMS
);

delete from (
...


Только Вам ещё потребуется в предикате сравнения аккуратно с NULLABLE значениями поработать, например, подставляя вместо NULL некий маркер типа "COALESCE(IMPLMTN_SLA_IND, '#')" ... "COALESCE(next_IMPLMTN_SLA_IND,'#'), или вообще выкинуть их из сравнения.

За правильность запроса не отвечу. Если есть желание, чтобы кто-то подробней с таким разбирался, пишите готовый SQL statement на создание таблицы и такой же на наполнение - "insert into ... values (...),(...),...". Картинка, конечно, наглядно, но с ней не поэкспериментировать, а писать наполнение самостоятельно - лень ;)

Delete уж сами скорректируете.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Хранимая процедура. Merge записей
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]