powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Быстрый поиск значений
14 сообщений из 14, страница 1 из 1
Быстрый поиск значений
    #39189569
Jimy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица с одним символьным полем, но несколько десятков тысяч записей. Иногда значения в этом поле дублируются, иногда повторяются по несколько раз. Подскажите, как быстро найти эти повторы и удалить лишние (одно значение должно остаться). Спасибо.
...
Рейтинг: 0 / 0
Быстрый поиск значений
    #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
Быстрый поиск значений
    #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
Быстрый поиск значений
    #39189575
Jimy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, но может я не совсем точно объяснил... Я не знаю, есть ли в таблице "fignya" или еще что. Смысл такой - взять первое значение и посмотреть, встречается ли оно еще где-нибудь в таблице. Если да - выкинуть. Проверяем дальше, если еще раз попалось - выкинуть. Затем значение из второй записи и т.д. Т.е оставить только уникальные.
...
Рейтинг: 0 / 0
Быстрый поиск значений
    #39189577
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тебе это и предложили. Суть в том что сначала отсортировать, затем сравнивать соседние, т.к. после сортировки одинаковые встанут друг-за-другом.
...
Рейтинг: 0 / 0
Быстрый поиск значений
    #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
Быстрый поиск значений
    #39189794
Jimy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, ну да... Всем спасибо!
...
Рейтинг: 0 / 0
Быстрый поиск значений
    #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
Быстрый поиск значений
    #39190505
alextashk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Людмila,

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

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

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

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


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


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