Удаление строк из таблицы в зависимости от предыдущего значения

#sql #mariadb #mariasql

#sql #mariadb #mariasql

Вопрос:

У меня есть набор данных, который выглядит следующим образом:

internal_id совпадение_id идентификатор компании_id market_id ( идентификатор рынка ) selection_id ( идентификатор выбора ) странное значение обновление_date
1 8576748 66 1 1 1.31 2021-01-05 17:59:41
36730 8576748 66 1 1 1.30 2021-01-05 18:58:41
47053 8576748 66 1 1 1.31 2021-01-05 19:59:41
2 8576748 66 1 2 14.00 2021-01-05 17:59:41
36731 8576748 66 1 2 14.00 2021-01-05 18:58:41
47054 8576748 66 1 2 14.00 2021-01-05 19:59:41
3 8576748 66 1 3 3.75 2021-01-05 17:59:41
36732 8576748 66 1 3 3.75 2021-01-05 18:58:41
47055 8576748 66 1 3 3.75 2021-01-05 19:59:41

Мне нужно удалить строки, в которых предыдущее значение odd_value для одного и того же match_id company_id market_id selection_id совпадает. В этом примере строки с internal_id: 36731, 47054, 36732, 47055 должны быть удалены.

Как вы можете видеть, это не удаление дублирования, строки 1 и 47053 одинаковы (для match_id company_id market_id selection_id), но они должны оставаться такими, какие они есть, потому что odd_value 1,30 (для internal_id 36730) отличается от предыдущего odd_value, а odd_value 1,31 (для internal_id 47053) отличается от предыдущее значение odd_value.

Чтобы перечислить эти данные, я использовал этот запрос:

 SELECT
    `internal_id`,
    `match_id`,
    `company_id`,
    `market_id`,
    `selection_id`,
    `odd_value`,
    `update_date`
    
FROM
    `odds`
WHERE
    `match_id` = 8576748
    AND `company_id` = 66
ORDER BY `match_id`, `company_id`, `market_id`, `selection_id`, `update_date`
 

Ответ №1:

вот как вы можете отличить строки, которые хотите удалить, и написать оператор удаления таким же образом :

 SELECT *
  ,CASE WHEN LAG(odd_value) OVER (PARTITION BY match_id, company_id , market_id,selection_id ORDER BY update_date) = odd_value THEN 1 ELSE 0 END AS tobeDeleted 
FROM `odds` 
 

Комментарии:

1. можете ли вы, пожалуйста, помочь мне также с удалением. У меня есть этот запрос: ВЫБЕРИТЕ * ИЗ (ВЫБЕРИТЕ *, СЛУЧАЙ, КОГДА ЗАДЕРЖКА (odd_value) ПРЕВЫШЕНА (РАЗДЕЛ ПО match_id, company_id, market_id, ПОРЯДОК выбора ПО update_date) = odd_value, ЗАТЕМ 1 ЕЩЕ 0 ЗАКАНЧИВАЕТСЯ КАК дубликат ИЗ odds ORDER BY match_id , company_id , market_id , selection_id , update_date ) КАК внутренняя таблица, ГДЕ duplikat = 1, но не может сделатьправильное УДАЛЕНИЕ, я пробовал с помощью WHERE internal_id, но это не работает

2. Я думаю, что я справился с этим: УДАЛИТЬ ИЗ odds WHERE internal_id IN (ВЫБЕРИТЕ internal_id ИЗ ( ВЫБЕРИТЕ *, СЛУЧАЙ, КОГДА ЗАДЕРЖКА (odd_value) ПРЕВЫШАЕТ (РАЗДЕЛ ПО match_id, company_id, market_id, selection_id ЗАКАЗ ПО update_date) = odd_value ТОГДА 1 ЕЩЕ 0 ЗАКАНЧИВАЕТСЯ КАК дубликат ИЗ odds ORDER BY match_id , company_id , market_id , selection_id , update_date ) КАК внутренняя таблица, ГДЕ дубликат= 1)