powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как удалить числе кроме самого большого за день?
11 сообщений из 11, страница 1 из 1
Как удалить числе кроме самого большого за день?
    #39668038
Фотография yarnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть небольшая задача, надо удалить все строки кроме самых больших чисел с учетом имени и дня
Код: sql
1.
2.
3.
SELECT max(rate)
FROM `bittrex_1m`
GROUP BY `name`, DATE(`dt`)



таблица:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE TABLE IF NOT EXISTS `table_1m` (
  `name` varchar(11) NOT NULL,
  `rate` varchar(15) NOT NULL,
  `dt` datetime NOT NULL
) DEFAULT CHARSET=utf8;
INSERT INTO `bittrex_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');



должны остаться строки
Код: sql
1.
2.
3.
4.
('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');
...
Рейтинг: 0 / 0
Как удалить числе кроме самого большого за день?
    #39668097
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WHERE NOT EXISTS (коррелированный подзапрос с группировкой и выбором максимума)
...
Рейтинг: 0 / 0
Как удалить числе кроме самого большого за день?
    #39668099
Фотография yarnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я пробовал так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
DELETE FROM `test_1m` 
WHERE NOT EXISTS (
  SELECT *
  FROM `test_1m` t2
  INNER JOIN (
    SELECT name, MAX(rate) rate
    FROM `test_1m`
    GROUP BY `name`, DATE(`dt`)
  ) t3
  ON t2.name = t3.name
  AND t2.rate = t3.rate
);



но выдает ошибку:
#1093 - You can't specify target table 'test_1m' for update in FROM clause
...
Рейтинг: 0 / 0
Как удалить числе кроме самого большого за день?
    #39668129
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НЕ легче ли было выбрать все строки с max(rate) во временную таблицу
Очистить исходную таблицу и залить в неё из временной?
...
Рейтинг: 0 / 0
Как удалить числе кроме самого большого за день?
    #39668142
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
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.
mysql> CREATE TABLE IF NOT EXISTS `bittrex_1m` (
    ->   `name` varchar(11) NOT NULL,
    ->   `rate` varchar(15) NOT NULL,
    ->   `dt` datetime NOT NULL
    -> ) DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.25 sec)

mysql> INSERT INTO `bittrex_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');
Query OK, 11 rows affected (0.02 sec)
Records: 11  Duplicates: 0  Warnings: 0

mysql> create view max_dt
    -> as
    -> select name, max(rate) rate, date(dt) dt
    -> from bittrex_1m
    -> group by name, date(dt);
Query OK, 0 rows affected (0.05 sec)

mysql> select *, date(dt) from bittrex_1m;
+---------+------------+---------------------+------------+
| name    | rate       | dt                  | date(dt)   |
+---------+------------+---------------------+------------+
| kurkuma | 0.00002150 | 2018-04-06 12:04:01 | 2018-04-06 |
| kurkuma | 0.00002151 | 2018-04-06 12:04:02 | 2018-04-06 |
| kurkuma | 0.00002152 | 2018-04-06 12:04:03 | 2018-04-06 |
| kurkuma | 0.00002153 | 2018-04-06 12:04:04 | 2018-04-06 |
| kurkuma | 0.00002159 | 2018-04-06 12:04:05 | 2018-04-06 |
| kurkuma | 0.00002154 | 2018-04-06 12:04:06 | 2018-04-06 |
| kurkuma | 0.00002155 | 2018-04-06 12:04:07 | 2018-04-06 |
| kurkuma | 0.00002156 | 2018-04-07 12:04:08 | 2018-04-07 |
| kurkuma | 0.00002157 | 2018-04-07 12:04:09 | 2018-04-07 |
| pahlava | 0.0000001  | 2018-04-06 12:04:02 | 2018-04-06 |
| pahlava | 0.0000002  | 2018-04-07 12:04:02 | 2018-04-07 |
+---------+------------+---------------------+------------+
11 rows in set (0.00 sec)

mysql> select * from max_dt;
+---------+------------+------------+
| name    | rate       | dt         |
+---------+------------+------------+
| kurkuma | 0.00002159 | 2018-04-06 |
| kurkuma | 0.00002157 | 2018-04-07 |
| pahlava | 0.0000001  | 2018-04-06 |
| pahlava | 0.0000002  | 2018-04-07 |
+---------+------------+------------+
4 rows in set (0.00 sec)

mysql> delete b.*
    -> from bittrex_1m b
    -> left join max_dt m on b.name=m.name and date(b.dt)=m.dt and b.rate=m.rate
    -> where m.name is null;
Query OK, 7 rows affected (0.03 sec)

mysql> drop view max_dt;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from bittrex_1m;
+---------+------------+---------------------+
| name    | rate       | dt                  |
+---------+------------+---------------------+
| 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 |
+---------+------------+---------------------+
4 rows in set (0.00 sec)

mysql>
...
Рейтинг: 0 / 0
Как удалить числе кроме самого большого за день?
    #39668239
Фотография yarnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо, на маленькой табличке получилось, на большой (~3 ляма) все грустно...
может быть как то так?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TEMPORARY TABLE max_rt
  select name, max(rate) rate, dt 
  from `table_1m`
  group by name, date(dt);

truncate table `table_1m`;

insert into `table_1m`
  select * from max_rt;


только время не совпадает....
...
Рейтинг: 0 / 0
Как удалить числе кроме самого большого за день?
    #39668243
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yarnikтолько время не совпадает....И не должно.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TEMPORARY TABLE max_rt
SELECT t0.name, t0.rate, t0.dt
FROM table_1m t0, ( SELECT name, MAX(rate) rate, DATE(dt) dt 
                    FROM `table_1m`
                    GROUP BY name, date(dt) ) t1
WHERE t0.name = t1.name
  AND t0.rate = t1.rate
  AND DATE(t0.dt) = t1.dt;
...
Рейтинг: 0 / 0
Как удалить числе кроме самого большого за день?
    #39668246
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это если максимальное значение одно.
...
Рейтинг: 0 / 0
Как удалить числе кроме самого большого за день?
    #39668259
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
982183Это если максимальное значение одно.Угу. Перенесутся все.А если их несколько за день, а нужно оставить только одну запись - нужен критерий выбора.
...
Рейтинг: 0 / 0
Как удалить числе кроме самого большого за день?
    #39668450
Фотография yarnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Благодарю за помощь и науку
...
Рейтинг: 0 / 0
Как удалить числе кроме самого большого за день?
    #39669406
Фотография yarnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ли как то ускорить запрос, если не принципиально какое время будет в колонке `dt`, лишь бы совпадала дата?
Имеется ввиду 1 запрос, т.к. обрабатывается это будет со скрипта и разделять на 3 разных запроса будет вероятность полностью удалить базу при сбое.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как удалить числе кроме самого большого за день?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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