Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы? / 25 сообщений из 27, страница 1 из 2
09.08.2017, 12:21
    #39502481
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
Здравствуйте!

Например, имеется таблица, в которой хранится лог данных некоего прибора с определенным интервалом времени, допустим, данные обновляются раз в секунду. Требуется занулить (null) данные, которые повторяются, чтобы остались только те данные, где происходит изменение значения. Прилагаю Excel с примером хотелки. Заранее спасибо за советы.

P.S.: Руководство очень хочет минимизировать объем хранимых данных.
...
Рейтинг: 0 / 0
09.08.2017, 13:37
    #39502556
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
iMrTidyРуководство очень хочет минимизировать объем хранимых данных.
Объясните этим идиотам, что место под значение поля записи будет занято вне зависимости от того, есть там некое значение, или там Null.
...
Рейтинг: 0 / 0
09.08.2017, 14:03
    #39502581
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
AkinaiMrTidyРуководство очень хочет минимизировать объем хранимых данных.
Объясните этим идиотам, что место под значение поля записи будет занято вне зависимости от того, есть там некое значение, или там Null.

При использовании InnoDB null не занимает места, о чем пишет и сам MySql.
...
Рейтинг: 0 / 0
09.08.2017, 15:47
    #39502700
yarnik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
создай уникальный ключ:

Value1+Value2+Value3
...
Рейтинг: 0 / 0
09.08.2017, 16:06
    #39502721
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
yarnikсоздай уникальный ключ:

Value1+Value2+Value3

Пока что не понял как это использовать. Можно немного подробнее?
...
Рейтинг: 0 / 0
09.08.2017, 16:13
    #39502726
yarnik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
Код: sql
1.
2.
3.
4.
5.
6.
CREATE TABLE IF NOT EXISTS `table` (
  `Value1` varchar(11) NOT NULL,
  `Value2` varchar(11) NOT NULL,
  `Value3` varchar(11) NOT NULL,
  PRIMARY KEY (`Value1`,`Value2`,`Value3`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
...
Рейтинг: 0 / 0
09.08.2017, 16:39
    #39502748
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
yarnik
Код: sql
1.
2.
3.
4.
5.
6.
CREATE TABLE IF NOT EXISTS `table` (
  `Value1` varchar(11) NOT NULL,
  `Value2` varchar(11) NOT NULL,
  `Value3` varchar(11) NOT NULL,
  PRIMARY KEY (`Value1`,`Value2`,`Value3`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;



Таблица уже имеется, используемый движок InnoDB, большая часть полей nullable. Требуется занулить данные от изменения к изменению.
...
Рейтинг: 0 / 0
09.08.2017, 16:41
    #39502750
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
iMrTidyПри использовании InnoDB null не занимает местаТолько для варчаров. Для чисел/дат - увы...
...
Рейтинг: 0 / 0
09.08.2017, 16:46
    #39502757
yarnik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
duplicate key update
...
Рейтинг: 0 / 0
09.08.2017, 17:00
    #39502777
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
iMrTidyТребуется занулить (null) данные, которые повторяются
1) Читаем FAQ: Нумерация строк и другие вопросы про использование переменных до полного понимания.
2) Реализуем - причём ключ сортировки при нумерации ОБЯЗАН быть уникальным.
3) Для каждого поля выполняем запрос
Код: sql
1.
2.
3.
4.
UPDATE table t1, table t2
SET t1.field = NULL
WHERE t1.field = t2.field
  AND t1.num = t2.num - 1
...
Рейтинг: 0 / 0
09.08.2017, 17:39
    #39502815
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
AkinaiMrTidyПри использовании InnoDB null не занимает местаТолько для варчаров. Для чисел/дат - увы...

А где про это можно почитать?
...
Рейтинг: 0 / 0
09.08.2017, 17:42
    #39502817
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
yarnikduplicate key update

Боюсь так не подойдет. Придется так по каждой отдельной колонке, и данные могут быть 0 и 1, и чередоваться несколько раз, а это может привести к потере данных.
...
Рейтинг: 0 / 0
09.08.2017, 17:45
    #39502820
yarnik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
а что мешает проверить есть ли запись,
если есть - удалить
и вставить новую
...
Рейтинг: 0 / 0
09.08.2017, 17:46
    #39502825
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
AkinaiMrTidyТребуется занулить (null) данные, которые повторяются
1) Читаем FAQ: Нумерация строк и другие вопросы про использование переменных до полного понимания.
2) Реализуем - причём ключ сортировки при нумерации ОБЯЗАН быть уникальным.
3) Для каждого поля выполняем запрос
Код: sql
1.
2.
3.
4.
UPDATE table t1, table t2
SET t1.field = NULL
WHERE t1.field = t2.field
  AND t1.num = t2.num - 1



На текущий момент решение очень похожее, но для 80 полей и пару десятков тысяч строк занимает слишком много времени.
...
Рейтинг: 0 / 0
09.08.2017, 21:03
    #39502934
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
iMrTidy80 полей и пару десятков тысяч строк
Ну тогда просто пробегитесь курсором в процедуре. Или, если хватит опыта, сделайте UPDATE на переменных...
...
Рейтинг: 0 / 0
09.08.2017, 22:26
    #39502962
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
AkinaiMrTidy80 полей и пару десятков тысяч строк
Ну тогда просто пробегитесь курсором в процедуре. Или, если хватит опыта, сделайте UPDATE на переменных...

Это все уже написано, я надеялся, что есть более оптимальный способ.

Достичь того же результата, но на порядок быстрее все же удалось, применив обычный foreach в C#.
...
Рейтинг: 0 / 0
09.08.2017, 22:29
    #39502965
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
AkinaiMrTidyПри использовании InnoDB null не занимает местаТолько для варчаров. Для чисел/дат - увы...

Протестировал как для VarChar, так и для других типов данных. InnoDB в сочетании с compact row существенно сокращает объем данных. Об это пишут здесь и здесь .
...
Рейтинг: 0 / 0
09.08.2017, 23:14
    #39502983
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
iMrTidy,

А у вас есть varchar-ы в логах прибора? Зачем?
Может, имеет смысл пересмотреть типы данных? И даже, возможно, что-то нормализовать?
...
Рейтинг: 0 / 0
09.08.2017, 23:58
    #39502997
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
miksoftiMrTidy,

А у вас есть varchar-ы в логах прибора? Зачем?
Может, имеет смысл пересмотреть типы данных? И даже, возможно, что-то нормализовать?

В логах прибора нет, есть, например, hex адреса команд.
...
Рейтинг: 0 / 0
10.08.2017, 00:02
    #39502998
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
iMrTidyhex адреса команд.Прекрасно ложатся в целочисленные поля. В MySQL есть даже трехбайтовые, если вдруг двух байтов мало, а четыре избыточно.
...
Рейтинг: 0 / 0
10.08.2017, 10:18
    #39503162
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
miksoftiMrTidyhex адреса команд.Прекрасно ложатся в целочисленные поля. В MySQL есть даже трехбайтовые, если вдруг двух байтов мало, а четыре избыточно.

Спасибо за совет! Возьму на вооружение.
...
Рейтинг: 0 / 0
10.08.2017, 18:21
    #39503649
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
iMrTidyAkinaпропущено...

Ну тогда просто пробегитесь курсором в процедуре. Или, если хватит опыта, сделайте UPDATE на переменных...

Это все уже написано, я надеялся, что есть более оптимальный способ.

Достичь того же результата, но на порядок быстрее все же удалось, применив обычный foreach в C#.

Сейчас тестирую, разница в скорости даже на 2 порядка. С 20 секунд до 0,2!
...
Рейтинг: 0 / 0
11.08.2017, 10:42
    #39503874
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
Возможно, кому-то пригодится, вот так решил задачу с денулификацией.
Код: 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.
use ...YourDataSchema...;

DELIMITER $$
DROP PROCEDURE IF EXISTS spUnNullify$$
CREATE PROCEDURE spUnNullify(in tempTableName varchar(45))
BEGIN

drop temporary table if exists t;
create temporary table if not exists t as (
	SELECT column_name, @rnk := @rnk + 1 as rnk
	FROM INFORMATION_SCHEMA.COLUMNS as i, (select @rnk := 0) as v
	WHERE TABLE_SCHEMA = '...YourSchema' AND TABLE_NAME = '...YourTable...'
	);
set @c = (select count(*) from t);
set @i = 0;
set @setVars = '';
set @selectCols = '';
set @varsInit = '';

while @i < @c do
	set @i = @i + 1;
    set @n = (select t.column_name from t where t.rnk = @i);
    set @selectCols = concat(@selectCols, ',@v', @i , ' := coalesce(t.', @n, ', @v', @i, ') as `', @n, '`');
	set @setVar = concat('set @v', @i, ' := '''';');
    prepare s from @setVar;
	execute s;
	deallocate prepare s;
	set @setVar = concat('set @v', @i, ' := null;'); -- Without the first declaring the data will blob at least once.
    prepare s from @setVar;
	execute s;
	deallocate prepare s;
end while;

set @dropTempTable = concat('drop temporary table if exists ', tempTableName);
prepare s from @dropTempTable;
execute s;
deallocate prepare s;

set @createTempTable = concat('create temporary table if not exists ', tempTableName, ' as (');
set @selectCols = substring(@selectCols from 2);
set @q = concat(@createTempTable, 'select ', @selectCols, ' from ...YourTable... as t where ...YourWhereStatement order by t.id)');
prepare s from @q;
execute s;
deallocate prepare s;

end$$
DELIMITER ;


Пользоваться решением можно так.
Код: sql
1.
2.
CALL spUnNullify('myTmpTbl');
select * from myTmpTbl;



Данные нулифицировал до вставки в базу простым foreach, что оказалось примерно в 100 раз быстрее, чем если делать это в базе.
Таблица с данными использует InnoDB и Row Format Compressed.
...
Рейтинг: 0 / 0
11.08.2017, 11:44
    #39503932
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.
80.
81.
82.
83.
mysql> CREATE TABLE test (
    -> Id INT,
    -> ElapsedTime INT,
    -> Value1 INT,
    -> Value2 CHAR(1),
    -> Value3 INT
    -> );
Query OK, 0 rows affected (0.31 sec)

mysql>
mysql> INSERT INTO test (Id,ElapsedTime,Value1,Value2,Value3)
    -> SELECT 1,42,0,'a',0 UNION ALL
    -> SELECT 2,43,0,'a',0 UNION ALL
    -> SELECT 3,44,0,'a',1 UNION ALL
    -> SELECT 4,45,1,'b',1 UNION ALL
    -> SELECT 5,46,1,'b',2 UNION ALL
    -> SELECT 6,47,1,'b',2 UNION ALL
    -> SELECT 7,48,0,'c',0 UNION ALL
    -> SELECT 8,49,0,'c',0 UNION ALL
    -> SELECT 9,50,0,'c',1 UNION ALL
    -> SELECT 10,51,0,'d',1 ;
Query OK, 10 rows affected (0.20 sec)
Records: 10  Duplicates: 0  Warnings: 0

mysql>
mysql> SELECT * FROM test;
+------+-------------+--------+--------+--------+
| Id   | ElapsedTime | Value1 | Value2 | Value3 |
+------+-------------+--------+--------+--------+
|    1 |          42 |      0 | a      |      0 |
|    2 |          43 |      0 | a      |      0 |
|    3 |          44 |      0 | a      |      1 |
|    4 |          45 |      1 | b      |      1 |
|    5 |          46 |      1 | b      |      2 |
|    6 |          47 |      1 | b      |      2 |
|    7 |          48 |      0 | c      |      0 |
|    8 |          49 |      0 | c      |      0 |
|    9 |          50 |      0 | c      |      1 |
|   10 |          51 |      0 | d      |      1 |
+------+-------------+--------+--------+--------+
10 rows in set (0.00 sec)

mysql>
mysql> SET @tmp1 := NULL;
Query OK, 0 rows affected (0.00 sec)

mysql> SET @tmp2 := NULL;
Query OK, 0 rows affected (0.00 sec)

mysql> SET @tmp3 := NULL;
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql> UPDATE test
    -> SET
    -> Value1 = CASE WHEN @tmp1 = Value1 THEN NULL ELSE (@tmp1:=Value1) END,
    -> Value2 = CASE WHEN @tmp2 = Value2 THEN NULL ELSE (@tmp2:=Value2) END,
    -> Value3 = CASE WHEN @tmp3 = Value3 THEN NULL ELSE (@tmp3:=Value3) END
    -> ORDER BY Id ASC;
Query OK, 8 rows affected (0.04 sec)
Rows matched: 10  Changed: 8  Warnings: 0

mysql>
mysql> SELECT * FROM test;
+------+-------------+--------+--------+--------+
| Id   | ElapsedTime | Value1 | Value2 | Value3 |
+------+-------------+--------+--------+--------+
|    1 |          42 |      0 | a      |      0 |
|    2 |          43 |   NULL | NULL   |   NULL |
|    3 |          44 |   NULL | NULL   |      1 |
|    4 |          45 |      1 | b      |   NULL |
|    5 |          46 |   NULL | NULL   |      2 |
|    6 |          47 |   NULL | NULL   |   NULL |
|    7 |          48 |      0 | c      |      0 |
|    8 |          49 |   NULL | NULL   |   NULL |
|    9 |          50 |   NULL | NULL   |      1 |
|   10 |          51 |   NULL | d      |   NULL |
+------+-------------+--------+--------+--------+
10 rows in set (0.00 sec)

mysql>
mysql> DROP TABLE test;
Query OK, 0 rows affected (0.16 sec)
...
Рейтинг: 0 / 0
11.08.2017, 15:05
    #39504138
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
Akina,

Отличный пример, но к сожалению рабоает медленно.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы? / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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