Комплексное удаление MYSQL - PullRequest
0 голосов
/ 01 июля 2018

Мне нужно удалить номера, кроме самого большого с указанием дня и имени

CREATE TABLE IF NOT EXISTS `test_1m` (
  `name` varchar(11) NOT NULL,
  `rate` varchar(15) NOT NULL,
  `dt` datetime NOT NULL
) DEFAULT CHARSET=utf8;
INSERT INTO `test_1m` (`name`, `rate`, `dt`) VALUES
('kurkuma', '0.00002150', '2018-04-06 12:04:01'),
('kurkuma', '0.00002151', '2018-04-06 12:04:02'),
('kurkuma', '0.00002152', '2018-04-06 12:04:03'),
('kurkuma', '0.00002153', '2018-04-06 12:04:04'),
('kurkuma', '0.00002159', '2018-04-06 12:04:05'),
('kurkuma', '0.00002154', '2018-04-06 12:04:06'),
('kurkuma', '0.00002155', '2018-04-06 12:04:07'),
('kurkuma', '0.00002156', '2018-04-07 12:04:08'),
('kurkuma', '0.00002157', '2018-04-07 12:04:09'),
('pahlava', '0.0000001', '2018-04-06 12:04:02'),
('pahlava', '0.0000002', '2018-04-07 12:04:02');

должно быть

('kurkuma', '0.00002159', '2018-04-06 12:04:05'),
('kurkuma', '0.00002157', '2018-04-07 12:04:09'),
('pahlava', '0.0000001', '2018-04-06 12:04:02'),
('pahlava', '0.0000002', '2018-04-07 12:04:02');

Может быть, что-то вроде этого. просто не работает =)

DELETE * FROM `test_1m`
WHERE NOT (
    SELECT max(rate)
    FROM `test_1m`
    GROUP BY `name`, DATE(`dt`)
)

1 Ответ

0 голосов
/ 01 июля 2018

В MySQL вы должны выразить фильтрацию для одной и той же таблицы, используя join:

delete t
    from test_1m t join
         (select name, date(dt) as dt, max(rate) as rate
          from test_1m
          group by name, date(dt)
         ) tt
         on tt.name = t.dt and tt.dt = t.date and
            t.rate < tt.rate;

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

create temporary table tokeep as
    select t.*
    from test_1m t
    where not exists (select 1
                      from test_1m t2
                      where t2.name = t.name and
                            date(t2.dt) = date(t.dt) and
                            t2.rate > t.rate
                      );

truncate table test_1m;

insert into test_1m
    select * from tokeep;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...