Форум: "Базы";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];
ВнизTable => Filter? Найти похожие ветки
← →
Jet © (2004-05-27 17:25) [0]Нужно составить следующий фильтр для таблицы:
Имеется таблица .dbf (FoxPro) с полем Fam, Name и т.д.
Ее нужно отфильтровать по первым пяти буквам фамилии и трем первым
буквам имени, т.е. если есть записи:
1 Иванов Петр
2 Иванова Петр
3 Ивашкин Петр
4 Ивашкин Пятр
То считать одинаковыми записи 1 и 2:
(Ивано)в (Пет)р
(Ивано)ва (Пет)р
Но разными 1,3,4:
(Ивано)в (Пет)р
(Ивашк)ин (Пет)р
(Ивашк)ин (Пят)р
или 2,3,4
(Ивано)ва (Пет)р
(Ивашк)ин (Пет)р
(Ивашк)ин (Пят)р
На выходе должно быть:
1 Иванов Петр
3 Ивашкин Петр
4 Ивашкин Пятр
или
2 Иванов Петр
3 Ивашкин Петр
4 Ивашкин Пятр
Т.е. фактически вывести уникальные записи по первым 5 буквам фамилии и
первым 3 буквам имени. Помогите кто знает.
← →
Соловьев © (2004-05-27 17:29) [1]событие OnFileterRecord:
Accept := <условие>;
пишешь вместо что в голову прийдет :)
← →
Jet © (2004-05-27 17:33) [2]А поподробнее по примеру можно пожалуйста?
← →
Sandman25+1 (2004-05-27 17:33) [3]Или
family like "ИВАНО%" and name like "ПЕТ%"
← →
Jet © (2004-05-27 17:36) [4]Так первые буквы не зивестны, если не взять запись. А сразу нельзя отфильтровать не используя буквы. К примеру :
AnsiLeftStr(Fam,5) <> AnsiLeftStr(Fam,5)
Что-то типа такого.
← →
Соловьев © (2004-05-27 17:37) [5]
> family like "ИВАНО%" and name like "ПЕТ%"
телепат:)
я и не знал что у него ФИО рассписано :)
← →
Соловьев © (2004-05-27 17:38) [6]
> Так первые буквы не зивестны, если не взять запись. А сразу
> нельзя отфильтровать не используя буквы. К примеру :
> AnsiLeftStr(Fam,5) <> AnsiLeftStr(Fam,5)
> Что-то типа такого.
в OnFilterRecord - фантазия безгранична :)
← →
Sandman25+1 (2004-05-27 17:43) [7]Перечитал первый пост. Что-то я не то отвечал...
Нужно что-то типаselect *
Но скорость будет ужасная.
from t t1
where not exists
(select 1
from t t2
where substr(t1.name, 1, 3) = substr(t2.name, 1, 3)
and substr(t1.family, 1, 5) = substr(t2.family, 1, 5)
and t2.id > t1.id
)
Зачем это все надо?
← →
Vlad © (2004-05-27 17:47) [8]
> Sandman25+1 (27.05.04 17:43) [7]
> Зачем это все надо?
Похоже на лабораторную работу :-)
> Jet © (27.05.04 17:25)
Если нужно именно фильтр, а не SQL, тогда Соловьев © (27.05.04 17:38) [6]
+
В Дельфи есть функция Copy, которая может вернуть тебе любой кусок строки.
← →
Соловьев © (2004-05-27 17:48) [9]Ах, блин, что-то я стал вообще не внимательным, действительно есть FIO
тогда
select *
from table
where family like :p1||"%" and name like :p2||"%"
где p1 и p2 - параметры заполняешь в проге
← →
Jet © (2004-05-27 17:49) [10]Мне нужно почистить большую базу ~200 метров
Просто там слишком много всяких Ивановых и т.д., у которых по ошибке набита какя-нибудь буква не так (дальше 5 буквы), а они в принципе одинаковы, вот и надо их "истребить" по записям..))))
← →
Sandman25+1 (2004-05-27 17:51) [11][10] Jet © (27.05.04 17:49)
Это очень опасно. Так можно и Иванова с Ивановичем спутать.
← →
Sandman25+1 (2004-05-27 17:52) [12][8] Vlad © (27.05.04 17:47)
Через фильтр очень сложно.
PS. Точнее, я совсем не представляю, как...
← →
HSolo © (2004-05-27 17:53) [13]>Jet © (27.05.04 17:49) [10]
А Вы уверены, что там нет какого-нибудь Ивановского или Иванопуло? У которого и после 5-й буквы все нормально?
← →
Соловьев © (2004-05-27 17:54) [14]
> Мне нужно почистить большую базу ~200 метров
> Просто там слишком много всяких Ивановых и т.д., у которых
> по ошибке набита какя-нибудь буква не так (дальше 5 буквы),
> а они в принципе одинаковы, вот и надо их "истребить" по
> записям..))))
ооо, знакомая ситуация...
опасна и трудна...
← →
Соловьев © (2004-05-27 17:56) [15]
> они в принципе одинаковы
нету какого-то поля которое точно идентефицирует человека? код налоговой допустим? или паспорт? По имени и фамилии - опасно очень.
← →
Jet © (2004-05-27 18:03) [16]Начну сначала. Было у меня две базы. Одна большая (~200 метров), другая небольшая (~1 метра). Мне нужно было вывести все записи из большой таблицы, которых нет в маленькой. Я это сделал вложенным запросом:
SELECT * FROM T1 WHERE NOT EXISTS (SELECT * FROM T2 WHERE
T2.Lname = T1.R08 and T2.Fname = ap.R09 and .... ) and T1.R17 <> "111" and ap.R17 <> "" and T1.R17 <> " " order by R18,R08");
Сделал я это. Сохранил все аккуратненько по разным текстовым файликам. А потом увидел, что есть например такое:
Иванов Иван Сергеевич
Ивановь Иван Сергеевич
Записи, согласитесь весьма одинаковы (ошибки набивщиков), и одна из них не нужна. Вот теперь и суть отфильтровать эти записи по ключу:
Фамилию по первым 5 буквам, имя по 3 буквам, отчество по 3 буквам + дата рождения из одной записи. Накроет конечно не всех, но очень неплохо сработает.
Других идентификационных данных нет..((
← →
HSolo © (2004-05-27 18:03) [17]Чистить таблицы "на автопилоте", без человека, это, по-моему, для любителей острых ощущений, вроде русской рулетки :)) Можно предоставить человеку сервис, что-нибудь вроде "отбор похожих записей" (по like, нечеткий поиск... по вкусу), но решение об удалении записи должен принимать человек, а не компьютер. По-моему, так (с) Винни-Пух.
А если на очищаемую таблицу кто-то ссылается - то нужен еще механизм перевешивания ссылок с удаляемой записи на правильную.
← →
Jet © (2004-05-27 18:45) [18]Начну сначала. Было у меня две базы. Одна большая (~200 метров), другая небольшая (~1 метра). Мне нужно было вывести все записи из большой таблицы, которых нет в маленькой. Я это сделал вложенным запросом:
SELECT * FROM T1 WHERE NOT EXISTS (SELECT * FROM T2 WHERE
T2.Lname = T1.R08 and T2.Fname = ap.R09 and .... ) and T1.R17 <> "111" and ap.R17 <> "" and T1.R17 <> " " order by R18,R08");
Сделал я это. Сохранил все аккуратненько по разным текстовым файликам. А потом увидел, что есть например такое:
Иванов Иван Сергеевич
Ивановь Иван Сергеевич
Записи, согласитесь весьма одинаковы (ошибки набивщиков), и одна из них не нужна. Вот теперь и суть отфильтровать эти записи по ключу:
Фамилию по первым 5 буквам, имя по 3 буквам, отчество по 3 буквам + дата рождения из одной записи. Накроет конечно не всех, но очень неплохо сработает.
Других идентификационных данных нет..((
← →
Anatoly Podgoretsky © (2004-05-27 19:03) [19]Jet © (27.05.04 18:45) [18]
Не факт, могут быть обе верные.
Предоставь право решать оператору, а ему выдай список
← →
Jet © (2004-05-27 20:57) [20]Может кто подкинет еще идею?
Спасибо.
← →
Соловьев © (2004-05-28 09:56) [21]ИМХР, изначально не правильно была заработана структура БД. Оператор не виноват, что разработчик не придумал PK(паспорт, код налоговой, код страхованитя и т.п.). Было бы это ключевое поле - никто не смог бы ввести одного и того же человека дважды. И такие вопросы еще должны решатся на этапе проеткирования, а не в процессе работы проги.
← →
Sergey13 © (2004-05-28 10:18) [22]2Соловьев © (28.05.04 09:56) [21]
>... что разработчик не придумал PK(паспорт, код налоговой, код страхованитя и т.п.)
Только не ПК, а просто уникальность.
2Jet © (27.05.04 18:03) [16]
>Было у меня две базы. Одна большая (~200 метров), другая небольшая (~1 метра).
А больше таблиц никаких нет? Просто список физ.лиц.? Что то на эти записи ссылается? Ну там деньги или еще что? А то ведь можно одного нечаянно миллионером сделать, друго нищим. 8-)
← →
Соловьев © (2004-05-28 10:19) [23]
> Только не ПК, а просто уникальность.
почему? можно и ПК
← →
Anatoly Podgoretsky © (2004-05-28 10:35) [24]Если при этом еще и нет ссылочной целостности, то красиво будет после удаления.
← →
Sergey13 © (2004-05-28 10:45) [25]2Соловьев © (28.05.04 10:19) [23]
>почему? можно и ПК
Можно. Но не нужно, по моему глубокому убеждению. Ибо в этой стане практически нет устойчивых реквизитов. Меняться может все что угодно. 8-( Но это вопрос из другой оперы.
← →
Соловьев © (2004-05-28 10:51) [26]
> Меняться может все что угодно. 8-( Но это вопрос из другой
> оперы.
Такой случай: был клиент и бул у него код например 3333333, все документы так и оформлялись, а потом например он сменил вид экономической деятельности и у него уже другой код, да вроде фамилия та же но - это уже другой клиент. поэтому когда будет менятся, надо заводить новую запись.
Хотя, наверное, лучше сделать суроганый ключ, а не естественный, но это тема для длинного спора...
← →
Sergey13 © (2004-05-28 11:01) [27]2Соловьев © (28.05.04 10:51) [26]
> да вроде фамилия та же но - это уже другой клиент. поэтому когда будет менятся, надо заводить новую запись.
Надо, кто спорит то? Это другой клиент. И старого оставить, с кодом 3333333. Если это критично для системы, то подумать как их логически объединять, если нет - то и так сойдет. 8-)
А паспорта... У меня в 39 лет уже второй (российский) у жены 3 или 4 (два раза замужем - причем второй раз удачно 8-)....
>но это тема для длинного спора...
Во-во... 8-)
← →
Anatoly Podgoretsky © (2004-05-28 11:25) [28]Соловьев © (28.05.04 10:51) [26]
Считай приведенный в вопросе пример как раз суррогатным ключом, поскольку там ничего естественного нет.
Суррогатные ключи обеспечивают только уникальность записи и ни как в данной ситуации не помогает, правда в данной ситуации ничего не поможет. Поскольку
Ивашкин Саша
Ивашкин Паша
могут быть как один и тот же человек, так и разные люди. Вопрос решается только административными путями, технические только в помощь к ним.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.032 c