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