Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Быстрый поиск значений / 14 сообщений из 14, страница 1 из 1
11.03.2016, 05:37
    #39189569
Jimy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрый поиск значений
Есть таблица с одним символьным полем, но несколько десятков тысяч записей. Иногда значения в этом поле дублируются, иногда повторяются по несколько раз. Подскажите, как быстро найти эти повторы и удалить лишние (одно значение должно остаться). Спасибо.
...
Рейтинг: 0 / 0
11.03.2016, 06:13
    #39189571
alextashk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрый поиск значений
Jimy,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT table1
INDEX ON odnopole TAG odnopole
SET ORDER TO TAG odnopole
lcOdnoPole = "fignya"
SCAN
  IF lcOdnoPole = OdnoPole THEN
    DELETE
  ELSE
    lcOdnoPole = OdnoPole
  ENDIF
ENDSCAN
...
Рейтинг: 0 / 0
11.03.2016, 06:25
    #39189574
Быстрый поиск значений
alextashkJimy,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT table1
INDEX ON odnopole TAG odnopole
SET ORDER TO TAG odnopole
lcOdnoPole = "fignya"
SCAN
  IF lcOdnoPole = OdnoPole THEN
    DELETE
  ELSE
    lcOdnoPole = OdnoPole
  ENDIF
ENDSCAN


Не... так не совсем корректно... если "fignya" есть в этом поле, конечно...
Мои дополнения к программе:
Лучше "обнулить" переменную (lcOdnoPole = "") и сравнивать не простым (=) равенством, а точным (==), то есть
IF lcOdnoPole == OdnoPole THEN... Это же символьное поле...
...
Рейтинг: 0 / 0
11.03.2016, 06:36
    #39189575
Jimy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрый поиск значений
Спасибо, но может я не совсем точно объяснил... Я не знаю, есть ли в таблице "fignya" или еще что. Смысл такой - взять первое значение и посмотреть, встречается ли оно еще где-нибудь в таблице. Если да - выкинуть. Проверяем дальше, если еще раз попалось - выкинуть. Затем значение из второй записи и т.д. Т.е оставить только уникальные.
...
Рейтинг: 0 / 0
11.03.2016, 06:58
    #39189577
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрый поиск значений
Тебе это и предложили. Суть в том что сначала отсортировать, затем сравнивать соседние, т.к. после сортировки одинаковые встанут друг-за-другом.
...
Рейтинг: 0 / 0
11.03.2016, 09:40
    #39189648
LUCIAN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрый поиск значений
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT 0
CREATE CURSOR CTEST (NAM C(20))
INSERT INTO CTEST VALUES ('ВАСЯ')
INSERT INTO CTEST VALUES ('Петя')
INSERT INTO CTEST VALUES ('Виктор')
INSERT INTO CTEST VALUES ('Вася')
INSERT INTO CTEST VALUES ('ПЕТЯ')
INSERT INTO CTEST VALUES ('ДиМА')
INSERT INTO CTEST VALUES ('СЕРГЕЙ')
INSERT INTO CTEST VALUES ('пАША')

SELECT NZ FROM (SELECT RECNO() NZ FROM CTEST) C1 WHERE NZ NOT IN ;
( SELECT MIN(NZ) MNZ FROM (SELECT RECNO() NZ,UPPER(CTEST.NAM) NAM FROM CTEST) C2  GROUP BY NAM ) INTO CURSOR CKR
SELECT CKR
SCAN
	DELETE FROM CTEST WHERE RECNO('CTEST') = CKR.NZ
ENDSCAN
SELECT CTEST
BROW
...
Рейтинг: 0 / 0
11.03.2016, 11:43
    #39189794
Jimy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрый поиск значений
А, ну да... Всем спасибо!
...
Рейтинг: 0 / 0
12.03.2016, 05:24
    #39190456
Людмila
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрый поиск значений
А если так?
Код: sql
1.
2.
3.
4.
5.
6.
7.
Select Table1
Scan for !Deleted()
  aa=RecNo()
  bb=fName
  Delete From Table1 where fName==bb and RecNo()>aa
  Go aa
EndScan


По-моему очень элегантное решение.
...
Рейтинг: 0 / 0
12.03.2016, 11:41
    #39190505
alextashk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрый поиск значений
Людмila,

Элегантно, но не эффективно - количество переборов всей таблицы будет равно количеству записей.
...
Рейтинг: 0 / 0
12.03.2016, 15:19
    #39190568
Людмila
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрый поиск значений
alextashkне эффективно - количество переборов всей таблицы будет равно количеству записей.
... минус удаленные записи! - Scan for !Deleted()
но ведь и нужно их проверить Все.
...
Рейтинг: 0 / 0
12.03.2016, 19:09
    #39190650
alextashk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрый поиск значений
Людмila,

На сколько я понимаю, физически считывается строка, затем рассматривается признак фильтрации deleted или равно,
а затем производится действие. То есть перебираются все записи таблицы столько раз сколько строк. То есть
согласно Вашего алгоритма таблица из 1000 строк будет перечитана 1000 раз, причем каждое чтение таблец будет для всех 1000 строк.
Мое решение предусматривает только 1 проход, т.е. если нет оптимизации по индексу - в 1000 раз быстрее.
...
Рейтинг: 0 / 0
13.03.2016, 03:03
    #39190756
Людмila
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрый поиск значений
alextashk,

Единственное, в чем вы не правы - Scan for !Deleted() перебирает все записи кроме удаленных.
Во всем остальном - полностью с вами согласна!
...
Рейтинг: 0 / 0
13.03.2016, 07:36
    #39190771
Людмila
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрый поиск значений
alextashk, Sorry!

alextashkМое решение предусматривает только 1 проход, т.е. ... - в 1000 раз быстрее.
Быстрее сего-лишь в 168 раз. (
...
Рейтинг: 0 / 0
13.03.2016, 18:20
    #39190933
asdor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрый поиск значений
Jimy,
Очевидно одноразовая (или редкая) задача
Код: sql
1.
select txt from mytab group by txt into table mytab1


После чего mytab1 переименовать в mytab
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Быстрый поиск значений / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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