|
Хранимая процедура. Merge записей
|
|||
---|---|---|---|
#18+
Доброго времени суток! Прошу помощи в написании хранимой процедуры Суть вот какая: есть таблица 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2016, 13:41 |
|
Хранимая процедура. Merge записей
|
|||
---|---|---|---|
#18+
Kovach, "В лоб" - в зависимости от того, что Вам нужно - сделать выборку или модифицировать исходную таблицу: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2016, 16:39 |
|
Хранимая процедура. Merge записей
|
|||
---|---|---|---|
#18+
CawaSPb, модифицировать таблицу ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2016, 17:11 |
|
Хранимая процедура. Merge записей
|
|||
---|---|---|---|
#18+
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) не то, что нужно :( ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2016, 17:48 |
|
Хранимая процедура. Merge записей
|
|||
---|---|---|---|
#18+
KovachCawaSPb, модифицировать таблицу Тогда, соответственно DELETE. Оно разбивает записи на группы ("partitions") по совпадению TRBL_TCKT_KEY и списка сравниваемых полей. Внутри группы нумерует в порядке возрастания версии. Потом всё, что "не первая запись внутри группы", удаляет. (Для одного TRBL_TCKT_KEY получается несколько групп по количеству уникальных "версий"). ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2016, 17:52 |
|
Хранимая процедура. Merge записей
|
|||
---|---|---|---|
#18+
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.
Только Вам ещё потребуется в предикате сравнения аккуратно с NULLABLE значениями поработать, например, подставляя вместо NULL некий маркер типа "COALESCE(IMPLMTN_SLA_IND, '#')" ... "COALESCE(next_IMPLMTN_SLA_IND,'#'), или вообще выкинуть их из сравнения. За правильность запроса не отвечу. Если есть желание, чтобы кто-то подробней с таким разбирался, пишите готовый SQL statement на создание таблицы и такой же на наполнение - "insert into ... values (...),(...),...". Картинка, конечно, наглядно, но с ней не поэкспериментировать, а писать наполнение самостоятельно - лень ;) Delete уж сами скорректируете. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2016, 17:09 |
|
|
start [/forum/topic.php?fid=43&fpage=11&tid=1600518]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
65ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
others: | 11ms |
total: | 152ms |
0 / 0 |