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

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

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

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

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

Value1+Value2+Value3

Пока что не понял как это использовать. Можно немного подробнее?
...
Рейтинг: 0 / 0
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
    #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
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
    #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
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
    #39502750
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iMrTidyПри использовании InnoDB null не занимает местаТолько для варчаров. Для чисел/дат - увы...
...
Рейтинг: 0 / 0
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
    #39502757
Фотография yarnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
duplicate key update
...
Рейтинг: 0 / 0
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
    #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
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
    #39502815
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaiMrTidyПри использовании InnoDB null не занимает местаТолько для варчаров. Для чисел/дат - увы...

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

Боюсь так не подойдет. Придется так по каждой отдельной колонке, и данные могут быть 0 и 1, и чередоваться несколько раз, а это может привести к потере данных.
...
Рейтинг: 0 / 0
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
    #39502820
Фотография yarnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а что мешает проверить есть ли запись,
если есть - удалить
и вставить новую
...
Рейтинг: 0 / 0
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
    #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
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
    #39502934
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iMrTidy80 полей и пару десятков тысяч строк
Ну тогда просто пробегитесь курсором в процедуре. Или, если хватит опыта, сделайте UPDATE на переменных...
...
Рейтинг: 0 / 0
Как лучше всего исключить повторяющиеся значения в каждой колонке таблицы?
    #39502962
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaiMrTidy80 полей и пару десятков тысяч строк
Ну тогда просто пробегитесь курсором в процедуре. Или, если хватит опыта, сделайте UPDATE на переменных...

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

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

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

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

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

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

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

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

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

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

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

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


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