Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как удалить числе кроме самого большого за день? / 11 сообщений из 11, страница 1 из 1
01.07.2018, 17:00
    #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
01.07.2018, 22:15
    #39668097
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить числе кроме самого большого за день?
WHERE NOT EXISTS (коррелированный подзапрос с группировкой и выбором максимума)
...
Рейтинг: 0 / 0
01.07.2018, 22:41
    #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
02.07.2018, 05:25
    #39668129
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить числе кроме самого большого за день?
НЕ легче ли было выбрать все строки с max(rate) во временную таблицу
Очистить исходную таблицу и залить в неё из временной?
...
Рейтинг: 0 / 0
02.07.2018, 07:53
    #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
02.07.2018, 12:07
    #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
02.07.2018, 12:18
    #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
02.07.2018, 12:22
    #39668246
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить числе кроме самого большого за день?
Это если максимальное значение одно.
...
Рейтинг: 0 / 0
02.07.2018, 12:39
    #39668259
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить числе кроме самого большого за день?
982183Это если максимальное значение одно.Угу. Перенесутся все.А если их несколько за день, а нужно оставить только одну запись - нужен критерий выбора.
...
Рейтинг: 0 / 0
02.07.2018, 17:01
    #39668450
yarnik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить числе кроме самого большого за день?
Благодарю за помощь и науку
...
Рейтинг: 0 / 0
04.07.2018, 12:18
    #39669406
yarnik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как удалить числе кроме самого большого за день?
Можно ли как то ускорить запрос, если не принципиально какое время будет в колонке `dt`, лишь бы совпадала дата?
Имеется ввиду 1 запрос, т.к. обрабатывается это будет со скрипта и разделять на 3 разных запроса будет вероятность полностью удалить базу при сбое.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как удалить числе кроме самого большого за день? / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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