powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Уникальность поля
16 сообщений из 16, страница 1 из 1
Уникальность поля
    #33644939
100gram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Возникла следующая проблема. Есть таблица (53000 записей) со случайными числами (5 полей). Как мне проверить, что каждая запись (каждая последовательность чисел) больше не повторяется в таблице? При этом сам порядок следования чисел не важен.

Спасибо.
...
Рейтинг: 0 / 0
Уникальность поля
    #33644941
100gram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Каждое число хранится в отдельном поле. Тип - character (но могу поменть, если это критично).
...
Рейтинг: 0 / 0
Уникальность поля
    #33644999
Петяня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не критично. Scatter To Mas -> Сортировка данных в массиве -> Create Table ... From Array Mas -> Select
...
Рейтинг: 0 / 0
Уникальность поля
    #33645004
Петяня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПетяняНе критично. Scatter To Mas -> Сортировка данных в массиве -> Create Table ... From Array Mas -> Select
Прошу прощения. "Create Table ... From Array Mas" заменить на "Create Table ... From Array Mas (Append From Array Mas)"
...
Рейтинг: 0 / 0
Уникальность поля
    #33645079
100gram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не понял. Это ведь только сортировка?
...
Рейтинг: 0 / 0
Уникальность поля
    #33645407
скуль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уникальность по столбцу или уникальность по все таблице?
...
Рейтинг: 0 / 0
Уникальность поля
    #33645449
скуль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если по столбцам, то
Код: plaintext
SELECT FLD01, COUNT(FLD01) from TABLE1 GROUP BY FLD01 HAVING COUNT(FLD01)> 1  INTO CURSOR DoubleList

Если по все таблице, то создать курсор и влить в него все значения из таблицы и потом к этому курсору указанный запрос
...
Рейтинг: 0 / 0
Уникальность поля
    #33645581
скуль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вопрос маленько не правильно прочитал. :D
можно
например так (table1 твоя таблица)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE CURSOR AllSeq (Fld01 c( 254 ))
SELECT table1 
Scan
	dimension SortArray(Fcount([Table1]))
	For RollFld= 1  to Fcount([Table1])
		NameField=Field(RollFld)
		SortArray(RollFld)=VAL(&NameField)
	EndFor
	=ASORT(SortArray)
	StringToInsert=[]
	For RollFld= 1  to Fcount([Table1])
		StringToInsert=StringToInsert+ALLTRIM(STR(SortArray(RollFld)))+IIF(RollFld<>Fcount([Table1]),[,],[])
	ENDFOR 
	INSERT INTO AllSeq VALUES (StringToInsert)
ENDSCAN

SELECT FLD01, COUNT(FLD01) from AllSeq GROUP BY FLD01 HAVING COUNT(FLD01)> 1  INTO CURSOR DoubleList
...
Рейтинг: 0 / 0
Уникальность поля
    #33647435
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
100gramЕсть таблица (53000 записей) со случайными числами (5 полей). Как мне проверить, что каждая запись (каждая последовательность чисел) больше не повторяется в таблице? При этом сам порядок следования чисел не важен.


Если в первой записи в 5 полях записаны значения 1,2,3,4,5, а во второй - 5,4,3,2,1 - такие записи считать повторяющимися? Т.е. считать такие записи одинаковыми?
...
Рейтинг: 0 / 0
Уникальность поля
    #33647443
100gram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ 100gramЕсть таблица (53000 записей) со случайными числами (5 полей). Как мне проверить, что каждая запись (каждая последовательность чисел) больше не повторяется в таблице? При этом сам порядок следования чисел не важен.


Если в первой записи в 5 полях записаны значения 1,2,3,4,5, а во второй - 5,4,3,2,1 - такие записи считать повторяющимися? Т.е. считать такие записи одинаковыми?

Да, считать.
...
Рейтинг: 0 / 0
Уникальность поля
    #33647583
100gram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
скульвопрос маленько не правильно прочитал. :D
можно
например так (table1 твоя таблица)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE CURSOR AllSeq (Fld01 c( 254 ))
SELECT table1 
Scan
	dimension SortArray(Fcount([Table1]))
	For RollFld= 1  to Fcount([Table1])
		NameField=Field(RollFld)
		SortArray(RollFld)=VAL(&NameField)
	EndFor
	=ASORT(SortArray)
	StringToInsert=[]
	For RollFld= 1  to Fcount([Table1])
		StringToInsert=StringToInsert+ALLTRIM(STR(SortArray(RollFld)))+IIF(RollFld<>Fcount([Table1]),[,],[])
	ENDFOR 
	INSERT INTO AllSeq VALUES (StringToInsert)
ENDSCAN

SELECT FLD01, COUNT(FLD01) from AllSeq GROUP BY FLD01 HAVING COUNT(FLD01)> 1  INTO CURSOR DoubleList


Работает ОЧЕНЬ долго. :-(
...
Рейтинг: 0 / 0
Уникальность поля
    #33647592
100gram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
скульвопрос маленько не правильно прочитал. :D
можно
например так (table1 твоя таблица)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE CURSOR AllSeq (Fld01 c( 254 ))
SELECT table1 
Scan
	dimension SortArray(Fcount([Table1]))
	For RollFld= 1  to Fcount([Table1])
		NameField=Field(RollFld)
		SortArray(RollFld)=VAL(&NameField)
	EndFor
	=ASORT(SortArray)
	StringToInsert=[]
	For RollFld= 1  to Fcount([Table1])
		StringToInsert=StringToInsert+ALLTRIM(STR(SortArray(RollFld)))+IIF(RollFld<>Fcount([Table1]),[,],[])
	ENDFOR 
	INSERT INTO AllSeq VALUES (StringToInsert)
ENDSCAN

SELECT FLD01, COUNT(FLD01) from AllSeq GROUP BY FLD01 HAVING COUNT(FLD01)> 1  INTO CURSOR DoubleList


Прошу прощения. Туплю. Работает по скорости приемлимо, но выдает нули в курсоре.
...
Рейтинг: 0 / 0
Уникальность поля
    #33647671
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Логика достаточно простая.

1) Надо из значений всех 5 полей сформировать символьную строку, но такую строку, чтобы под каждое число (значение поля) отводилось фиксированное количество символов и все числа в строке распологались бы в порядке возрастания (или убывания - не важно).

Например, если в одной записи содержаться числа: 12, 1, 25, 7, 30

То формируем из них символьную строку вида: "00010007001200250030".

Как ее сформировать - чуть ниже. Вкратце уже намекнул Петяня

2) Ищем дубли сформированных строк простым запросом Select-SQL с условием HAVING COUNT(*)>1


Код: plaintext
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.
* Тестовые данные
create cursor curDouble (f1 N( 10 ), f2 N( 10 ), f3 N( 10 ), f4 N( 10 ), f5 N( 10 ))
insert into curDouble (f1, f2, f3, f4, f5) values ( 12 ,  1 ,  25 ,  7 ,  30 )
insert into curDouble (f1, f2, f3, f4, f5) values ( 30 ,  7 ,  25 ,  1 ,  12 )
insert into curDouble (f1, f2, f3, f4, f5) values ( 1 ,  2 ,  3 ,  4 ,  5 )

* Выборка
SELECT ;
	makeLine(f1,f2,f3,f4,f5) as OneLine, ;
	COUNT(*) as kol ;
FROM curDouble ;
GROUP BY  1  ;
HAVING COUNT(*)> 1 



* Функция, вызываемая в Select-SQL
FUNCTION makeLine(tf1, tf2, tf3, tf4, tf5)
* Возвращаемая строка
LOCAL lcLine
lcLine = ''

* Заполняю массив
LOCAL laLine( 5 )
laLine[ 1 ] = m.tf1
laLine[ 2 ] = m.tf2
laLine[ 3 ] = m.tf3
laLine[ 4 ] = m.tf4
laLine[ 5 ] = m.tf5

* Упорядочиваю массив
=asort(laLine)

* Формирую из элементов массива строку
LOCAL lnI
FOR m.lnI= 1  TO ALEN(laLine)
	lcLine = m.lcLine + PADL(laLine[m.lnI], 10 )	
ENDFOR

RETURN m.lcLine 
ENDFUNC

Не знаю, насколько такая функция окажется эффективной (в смысле - быстрой) в твоем случае. Возможно, эффективнее будет сделать прямое сканирование таблицы.
...
Рейтинг: 0 / 0
Уникальность поля
    #33647763
luzir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Битовые маски тебе помогут.
Удачи.
...
Рейтинг: 0 / 0
Уникальность поля
    #33647791
скуль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
100gram
Прошу прощения. Туплю. Работает по скорости приемлимо, но выдает нули в курсоре.
В котором именно курсоре?
...
Рейтинг: 0 / 0
Уникальность поля
    #33650714
Скуль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМЛогика достаточно простая.

1) Надо из значений всех 5 полей сформировать символьную строку, но такую строку, чтобы под каждое число (значение поля) отводилось фиксированное количество символов и все числа в строке распологались бы в порядке возрастания (или убывания - не важно).

Например, если в одной записи содержаться числа: 12, 1, 25, 7, 30

То формируем из них символьную строку вида: "00010007001200250030".

Как ее сформировать - чуть ниже. Вкратце уже намекнул Петяня

2) Ищем дубли сформированных строк простым запросом Select-SQL с условием HAVING COUNT(*)>1


Код: plaintext
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.
* Тестовые данные
create cursor curDouble (f1 N( 10 ), f2 N( 10 ), f3 N( 10 ), f4 N( 10 ), f5 N( 10 ))
insert into curDouble (f1, f2, f3, f4, f5) values ( 12 ,  1 ,  25 ,  7 ,  30 )
insert into curDouble (f1, f2, f3, f4, f5) values ( 30 ,  7 ,  25 ,  1 ,  12 )
insert into curDouble (f1, f2, f3, f4, f5) values ( 1 ,  2 ,  3 ,  4 ,  5 )

* Выборка
SELECT ;
	makeLine(f1,f2,f3,f4,f5) as OneLine, ;
	COUNT(*) as kol ;
FROM curDouble ;
GROUP BY  1  ;
HAVING COUNT(*)> 1 



* Функция, вызываемая в Select-SQL
FUNCTION makeLine(tf1, tf2, tf3, tf4, tf5)
* Возвращаемая строка
LOCAL lcLine
lcLine = ''

* Заполняю массив
LOCAL laLine( 5 )
laLine[ 1 ] = m.tf1
laLine[ 2 ] = m.tf2
laLine[ 3 ] = m.tf3
laLine[ 4 ] = m.tf4
laLine[ 5 ] = m.tf5

* Упорядочиваю массив
=asort(laLine)

* Формирую из элементов массива строку
LOCAL lnI
FOR m.lnI= 1  TO ALEN(laLine)
	lcLine = m.lcLine + PADL(laLine[m.lnI], 10 )	
ENDFOR

RETURN m.lcLine 
ENDFUNC

Не знаю, насколько такая функция окажется эффективной (в смысле - быстрой) в твоем случае. Возможно, эффективнее будет сделать прямое сканирование таблицы.
Только здесь нужно учитывать, что поля чар, и если одно из них будет пустое, то например ' '+' 3'<>' 0'+' 3' :(
А в моем примере нули могут буть, если в полях числа 0 целых N десятых, в этом случае перевод нуно делать в стринг учитывая дробную часть
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Уникальность поля
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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