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

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

Спасибо.
...
Рейтинг: 0 / 0
05.04.2006, 02:01
    #33644941
100gram
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность поля
Каждое число хранится в отдельном поле. Тип - character (но могу поменть, если это критично).
...
Рейтинг: 0 / 0
05.04.2006, 07:05
    #33644999
Петяня
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность поля
Не критично. Scatter To Mas -> Сортировка данных в массиве -> Create Table ... From Array Mas -> Select
...
Рейтинг: 0 / 0
05.04.2006, 07:11
    #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
05.04.2006, 08:20
    #33645079
100gram
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность поля
Не понял. Это ведь только сортировка?
...
Рейтинг: 0 / 0
05.04.2006, 10:44
    #33645407
скуль
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность поля
Уникальность по столбцу или уникальность по все таблице?
...
Рейтинг: 0 / 0
05.04.2006, 10:52
    #33645449
скуль
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность поля
Если по столбцам, то
Код: plaintext
SELECT FLD01, COUNT(FLD01) from TABLE1 GROUP BY FLD01 HAVING COUNT(FLD01)> 1  INTO CURSOR DoubleList

Если по все таблице, то создать курсор и влить в него все значения из таблицы и потом к этому курсору указанный запрос
...
Рейтинг: 0 / 0
05.04.2006, 11:24
    #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
05.04.2006, 19:38
    #33647435
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность поля
100gramЕсть таблица (53000 записей) со случайными числами (5 полей). Как мне проверить, что каждая запись (каждая последовательность чисел) больше не повторяется в таблице? При этом сам порядок следования чисел не важен.


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


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

Да, считать.
...
Рейтинг: 0 / 0
05.04.2006, 21:51
    #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
05.04.2006, 21:56
    #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
05.04.2006, 23:30
    #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
06.04.2006, 03:21
    #33647763
luzir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность поля
Битовые маски тебе помогут.
Удачи.
...
Рейтинг: 0 / 0
06.04.2006, 04:39
    #33647791
скуль
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Уникальность поля
100gram
Прошу прощения. Туплю. Работает по скорости приемлимо, но выдает нули в курсоре.
В котором именно курсоре?
...
Рейтинг: 0 / 0
07.04.2006, 05:24
    #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
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Уникальность поля / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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