powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Удалить дублирующиеся строки, по условию
11 сообщений из 11, страница 1 из 1
Удалить дублирующиеся строки, по условию
    #40062231
mynick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
-- Версия сервера: 5.5.49-

CREATE TABLE IF NOT EXISTS `text_score_history` (
`id` int(10) unsigned NOT NULL,
  `text_id` mediumint(8) unsigned NOT NULL,
  `score` tinyint(3) unsigned NOT NULL,
  `dt` date NOT NULL
) ENGINE=MyISAM AUTO_INCREMENT=38924992 DEFAULT CHARSET=cp1251;


INSERT INTO `text_score_history` (`id`, `text_id`, `score`, `dt`) VALUES
(9829614, 64, 151, '2019-08-29'),
(10131139, 64, 151, '2019-09-01'),
(10433130, 64, 151, '2019-09-15'),
(10736614, 64, 151, '2019-09-21'),
(11040882, 64, 150, '2019-09-29'),
(11345906, 64, 151, '2019-10-03'),
(11651367, 64, 150, '2019-10-16'),
(11958033, 64, 150, '2019-10-24'),
(12265474, 64, 150, '2019-11-07'),
(12574423, 64, 150, '2019-11-18'),
(12884920, 64, 150, '2019-12-04'),
(13198030, 64, 150, '2019-12-13'),
(13512332, 64, 150, '2019-12-21'),
(13827796, 64, 150, '2019-12-25'),
(14142451, 64, 150, '2019-12-28'),
(14457456, 64, 150, '2019-12-29'),
(14772716, 64, 149, '2019-12-29'),
(15088073, 64, 149, '2020-01-12'),
(15405320, 64, 150, '2020-01-18'),
(15723714, 64, 150, '2020-02-12'),
(16046080, 64, 150, '2020-02-16'),
(16369442, 64, 150, '2020-02-22'),
(16693755, 64, 150, '2020-02-22'),
(17018317, 64, 150, '2020-03-01'),
(17344326, 64, 150, '2020-03-06'),
(17671398, 64, 149, '2020-03-07'),
(17998778, 64, 149, '2020-03-07'),
(18326273, 64, 148, '2020-03-15'),
(18655407, 64, 148, '2020-03-27'),
(18987677, 64, 147, '2020-03-29'),
(19320576, 64, 148, '2020-03-30'),
(19653863, 64, 147, '2020-04-01'),
(19987825, 64, 149, '2020-04-03'),
(20322566, 64, 149, '2020-04-03'),
(20657307, 64, 151, '2020-04-04'),
(20992439, 64, 150, '2020-04-05'),
(21328000, 64, 150, '2020-04-06'),
(21664050, 64, 150, '2020-04-07'),
(22000585, 64, 151, '2020-04-07'),
(22337120, 64, 151, '2020-05-01'),
(22682112, 64, 150, '2020-05-31'),
(23034364, 64, 150, '2020-05-31'),
(23386616, 64, 150, '2020-06-01'),
(23739124, 64, 150, '2020-06-02'),
(24092001, 64, 149, '2020-06-27'),
(24449795, 64, 147, '2020-07-20'),
(24811512, 64, 147, '2020-08-07'),
(25176081, 64, 147, '2020-08-07'),
(25540810, 64, 148, '2020-08-29'),
(25907929, 64, 148, '2020-09-27'),
(26277790, 64, 148, '2020-09-28'),
(26647651, 64, 148, '2020-09-28'),
(27017517, 64, 148, '2020-10-04'),
(27388090, 64, 148, '2020-10-04'),
(27758739, 64, 148, '2020-10-22'),
(28130834, 64, 150, '2020-10-22'),
(28502929, 64, 149, '2020-10-26'),
(28875546, 64, 147, '2020-11-17'),
(29250275, 64, 147, '2020-11-18'),
(29625465, 64, 147, '2020-12-22'),
(30004182, 64, 147, '2020-12-23'),
(30383159, 64, 127, '2020-12-28'),
(30762836, 64, 147, '2020-12-29'),
(31142805, 64, 127, '2021-01-05'),
(31523713, 64, 127, '2021-01-05'),
(31904621, 64, 146, '2021-01-06'),
(32285824, 64, 146, '2021-01-16'),
(32668794, 64, 146, '2021-01-17'),
(33052062, 64, 146, '2021-01-18'),
(33435656, 64, 146, '2021-01-19'),
(33819696, 64, 145, '2021-02-12'),
(34207954, 64, 145, '2021-02-13'),
(34596477, 64, 145, '2021-02-14'),
(34985248, 64, 145, '2021-02-22'),
(35375429, 64, 145, '2021-02-23'),
(35765988, 64, 145, '2021-02-24'),
(36156895, 64, 145, '2021-03-05'),
(36549463, 64, 145, '2021-03-06'),
(36942379, 64, 145, '2021-03-07'),
(37335695, 64, 147, '2021-03-26'),
(37732820, 64, 147, '2021-03-27'),
(38130218, 64, 147, '2021-03-27'),
(38527616, 64, 147, '2021-03-27');

ALTER TABLE `text_score_history`
ALTER TABLE `text_score_history`
MODIFY `id` int(10) unsigned NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=38924992;



1. Есть таблица с оценками статей (0...255).

Нужно оставить в таблице только те строки, где были изменения оценки score . Остальные строки удалить.

Было так:
Код: plaintext
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.
 (9829614, 64, 151, '2019-08-29'),
(10131139, 64, 151, '2019-09-01'),
(10433130, 64, 151, '2019-09-15'),
(10736614, 64, 151, '2019-09-21'),
(11040882, 64, 150, '2019-09-29'),
(11345906, 64, 151, '2019-10-03'),
(11651367, 64, 150, '2019-10-16'),
(11958033, 64, 150, '2019-10-24'),
(12265474, 64, 150, '2019-11-07'),
(12574423, 64, 150, '2019-11-18'),
(12884920, 64, 150, '2019-12-04'),
(13198030, 64, 150, '2019-12-13'),
(13512332, 64, 150, '2019-12-21'),
(13827796, 64, 150, '2019-12-25'),
(14142451, 64, 150, '2019-12-28'),
(14457456, 64, 150, '2019-12-29'),
(14772716, 64, 149, '2019-12-29'),
(15088073, 64, 149, '2020-01-12'),
(15405320, 64, 150, '2020-01-18'),
(15723714, 64, 150, '2020-02-12'),
(16046080, 64, 150, '2020-02-16'),
(16369442, 64, 150, '2020-02-22'),
(16693755, 64, 150, '2020-02-22'),
(17018317, 64, 150, '2020-03-01'),
(17344326, 64, 150, '2020-03-06'),
(17671398, 64, 149, '2020-03-07'),

Нужно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 (9829614, 64,  151 , '2019-08-29'),
(11040882, 64,  150 , '2019-09-29'),
(11345906, 64,  151 , '2019-10-03'),
(11651367, 64,  150 , '2019-10-16'),
(14772716, 64,  149 , '2019-12-29'),
(15405320, 64,  150 , '2020-01-18'),
(17671398, 64,  149 , '2020-03-07'),


2. Я записываю текущие оценки в историю оценок text_score_history - следующим запросом:
INSERT INTO text_score_history (text_id, score, dt) SELECT id, score, NOW() FROM texts
(в таблице texts - около 400.000 записей)

Можно ли как-то быстро добавлять только изменившиеся оценки, т.е. добавлять когда:
text_score_history.score (для последней записи) <>texts.score
...
Рейтинг: 0 / 0
Удалить дублирующиеся строки, по условию
    #40062241
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
DELETE t2.*
FROM text_score_history t1
JOIN text_score_history t2 ON t1.text_id = t2.text_id
                          AND t1.score = t2.score
                          AND t1.dt < t2.dt
LEFT JOIN text_score_history t3 ON t1.text_id = t3.text_id
                               AND t1.dt < t3.dt
                               AND t3.dt < t2.dt
WHERE t3.id IS NULL;


fiddle

mynick
Было так

Вот какого [censored] это "было" (и соответственно последующее "нужно") не соответствует выложенному коду, а?
...
Рейтинг: 0 / 0
Удалить дублирующиеся строки, по условию
    #40062242
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mynick
Можно ли как-то быстро добавлять только изменившиеся оценки, т.е. добавлять когда:
text_score_history.score (для последней записи) <>texts.score
Можно. Рисуйте соответствующий триггер. Ну и используйте INSERT IGNORE.
...
Рейтинг: 0 / 0
Удалить дублирующиеся строки, по условию
    #40062400
mynick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina

Огромное спасибо. Пример реально работает.
На реальных данных (40 млн записей) - уже почти час выполняется запрос.


Akina
Вот какого [censored] это "было" (и соответственно последующее "нужно") не соответствует выложенному коду, а?

Пытался показать пример (что примерно есть и что нужно) и урезать данные, чтобы не раздувать пост простым копированием.
...
Рейтинг: 0 / 0
Удалить дублирующиеся строки, по условию
    #40062448
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mynick
На реальных данных (40 млн записей) - уже почти час выполняется запрос.
И ещё будет пыхтеть до-о-лго... А сколько соответствующий SELECT на реальных данных выполняется - не смотрел? А то при удалении такими комплексными запросами куда как разумнее сперва выгрести во временную таблицу те записи, которые надо удалить (ну, само собой, только их id) - и потом уже их прибить.
...
Рейтинг: 0 / 0
Удалить дублирующиеся строки, по условию
    #40062457
mynick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
Т.к. выполнялось почти 3 часа, прибил процесс. И в надежде на увеличение скорости - добавил отдельные индексы для dt и score и запустил заново.

Попробую запустить select.
...
Рейтинг: 0 / 0
Удалить дублирующиеся строки, по условию
    #40062461
mynick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mynick,

select по данным все еще выполняется (>15 минут).
А если сделать это 5 частями и добавив к WHERE t3.id IS NULL and (t1.text_id<=100000), (t1.text_id>100000 and t1.text_id<=200000 и т.д.), будет заметно быстрее?
...
Рейтинг: 0 / 0
Удалить дублирующиеся строки, по условию
    #40062471
mynick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
с WHERE t3.id IS NULL and (t1.text_id<=10000) - выполняется 4 минуты.

Единственное, заметил, что если одинаковые dt и score, пример:
(11345906, 64, 150 , ' 2019-10-03 ')
(11651367, 64, 150 , ' 2019-10-03 ')
данные не удаляются.

Я этот момент не учел в коде первого поста :(
...
Рейтинг: 0 / 0
Удалить дублирующиеся строки, по условию
    #40062480
mynick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=54f088c2b84f564fd39cd28e820c67ed

После:
(11040882, 64, 150, '2019-09-29'),
Добавил строку:
(11040883, 64, 150, '2019-09-29'),

Видно сейчас в результатах
...
Рейтинг: 0 / 0
Удалить дублирующиеся строки, по условию
    #40062524
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит, надо сравнивать не dt, а соотв. id. Всего-то.
...
Рейтинг: 0 / 0
Удалить дублирующиеся строки, по условию
    #40062591
mynick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, огромное спасибо. Все работает.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Удалить дублирующиеся строки, по условию
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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