Удалить данные, основанные на подсчете и отметке времени, используя pl \ sql - PullRequest
0 голосов
/ 04 мая 2020

Я новичок в программировании на PL \ SQL, и я из ДБА. У меня есть одно требование удалить данные как из основной таблицы, так и из справочной таблицы, но при удалении данных необходимо следовать приведенной ниже логике c, поскольку нам необходимо удалить 30 М данных из таблиц, поэтому мы сокращаем данные на основе столбца «State_ID» ниже.

Следующие условия необходимо учитывать 1. В соответствии с данными выборки, приведенными ниже (основная таблица), сортируйте данные на основе метки времени с порядком des c и оставляйте первые 2 строки данных для каждого «State_id» и удалите оставшиеся данные из обеих таблиц на основе столбца «state_id». 2. выберите state_id, count () из группы maintable по порядку state_id по отметке времени des c Имеет count ()> 2;

Так что если у state_id = 1 есть 5 строк, то он должен удалите 3 строки данных, оставив первые 2 строки для state_id = 1, и повторите для других значений state_id.

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

Пожалуйста, помогите кому-нибудь меня по этому вопросу. Спасибо.

введите описание изображения здесь

Основной стол

1 Ответ

1 голос
/ 04 мая 2020

Вы должны иметь возможность удалять каждую таблицу одной командой SQL. Все остальное по сути заставило бы построчную обработку, которая является последней вещью, которую вы хотите для такого большого количества данных. Примерно так:

delete from main_table m
where m.row_id not in (
    with keep_me as (
        select row_id, 
               row_number() over (partition by state_id 
                                      order by time_stamp desc) id_row_number 
          from main_table where id_row_number<3)
    select row_id from keep_me)

или

delete from main_table m 
where m.row_id in (
    with delete_me as (
        select row_id, 
               row_number() over (partition by state_id 
                                      order by time_stamp desc) id_row_number 
        from main_table where id_row_number>2)
    select row_id from delete_me)
...