:: Архив конференции по VFP до 2005 года
SQL-запрос
rusl
Автор

Сообщений: 200
Откуда: СПб
Дата регистрации: 01.02.2005
Во первых, спасибо всем лисоводам форума, кто помогал мне осваивать Фокс и не бурчал на наивность, а иногда и глупость вопросов. Ваша помошь для меня очень важна.

Позвольте задать еще один вопрос (или точнее проконсультироваться).

Дано:
Таблица (lcTableName) с полями FileNameID (идентификационный номер файла, откудо взято слово), SubWord (само слово), Frequency (частота слова в данном файле).

Вопрос:
Как сделать запрос так, чтобы из этой таблицы (lcTableName) получить таблицу (lcTableInterval) c полями SubWord (то же что и в таблице (lcTableName)), interval_0, interval_1, interval_2, interval_3, interval_4, interval_5, interval_6, interval_7

где:
interval_0 - поле соответствующее количеству файлов в которых частота данного слова будет равна 0
interval_1- поле соответствующее количеству файлов в которых частота данного слова будет лежать в промежутке от 0 до 0.000001
interval_2 - -//- в промежутке от 0.000001 до 0.00001
interval_3 - -//- в промежутке от 0.00001 до 0.0001
interval_4 - -//- в промежутке от 0.0001 до 0.001
interval_5 - -//- в промежутке от 0.001 до 0.01
interval_6 - -//- в промежутке от 0.01 до 0.1
interval_7 - поле соответствующее количеству файлов в которых частота данного слова будет больше 0.1

(Соответственно, если в таблице 5 файлов (с идентификационными номерами 1, 2, 3, 4, 5) и данное слово присутствует во всех файлах, то сумма значений полей interval_0,...interval_7 для данного слова будет равна 5.)


Как концептуально это делать? Можно ли обойтись только SQL-запросом или нет? (Все что придумал на данный момент слишком громоздко и не практично).
Пример таблицы (lcTableName)
http://www.rusl.ru/img/fox-screen6.gif



Отредактировано (25.02.05 18:55)


------------------
Ratings: 0 negative/0 positive
Re: Можно или нет?
Владимир Максимов

Сообщений: 14097
Откуда: Москва
Дата регистрации: 02.09.2000
SELECT ;
SubWord, ;
COUNT(*) as interval_0, ;
SUM(IIF(BETWEEN(Frequency,0,0.000001),1,0)) as interval_1, ;
SUM(IIF(BETWEEN(Frequency,0.000001,0.0001),1,0)) as interval_2, ;
...
FROM (lcTableName) ;
INTO CURSOR &lcTableInterval NOFILTER ;
GROUP BY SubWord

-) Подсчитать количество не существующих записей в принципе невозможно. в данном случае поле interval_0 будет содержать количество таблиц, в которых данное слово используется. Т.е. для определения количества таблиц, где данное слово НЕ используется надо просто вычесть это число из общего количества таблиц

-) Интервалы надо задать НЕ пересекающиеся. В твоем пример, например, при частоте 0.01 будет увеличено как значение поля interval_5, так и значение поля interval_6.




------------------
Ratings: 0 negative/0 positive
Re: Можно или нет?
rusl
Автор

Сообщений: 200
Откуда: СПб
Дата регистрации: 01.02.2005
Спасибо Владимир! (Ваши коды всегда удивляют меня, как красиво можно решить проблему

Смотрю сейчас, отчего здесь выскакивает ошибка:
http://www.rusl.ru/img/fox-screen7.gif
Ratings: 0 negative/0 positive
Re: Можно или нет?
Игорь Л.

Сообщений: 164
Откуда: Евпатория
Дата регистрации: 26.11.2003
У тебя просто имеется пробельная строка... если она тебе нужна (в чем сомневаюсь) то в ней поставь точку с запятой ( ; )




------------------
И все мы делаем! Козьма Прутков
Ratings: 0 negative/0 positive
Re: Можно или нет?
rusl
Автор

Сообщений: 200
Откуда: СПб
Дата регистрации: 01.02.2005
Да. Я уже понял.
Но теперь не легче
http://www.rusl.ru/img/fox-screen8.gif
Ratings: 0 negative/0 positive
Re: Можно или нет?
Joys

Сообщений: 3511
Откуда: Старая Русса
Дата регистрации: 25.06.2000
2rusl
Просьба придерживаться правил форума а именно
Цитата:
Ув. Спрашивающие - пожалуйста, формируйте в заголовке темы суть проблемы максимально конкретно - заявления, типа "П-а-м-агите чем можете" или "Никак не разберусь в чём дело" не отражают суть Вашей проблемы. Будьте добры, указывайте хотя бы название компоненты, ф-ции, метода - хоть что-то, что может конкретизировать ваш запрос. В теле сообщения указывайте версию FoxPro, номер SP и тип ОС в которой происходит проблема - ведь некоторые решения неприменимы для тех или иных конфигураций...
Ratings: 0 negative/0 positive
Re: Можно или нет?
rusl
Автор

Сообщений: 200
Откуда: СПб
Дата регистрации: 01.02.2005
Хорошо. Постараюсь формулировать более конкретно. Спасибо за конструктивную критику.
Ratings: 0 negative/0 positive
Re: Можно или нет?
Владимир Максимов

Сообщений: 14097
Откуда: Москва
Дата регистрации: 02.09.2000
Добавь пробелов непосредственно перед символами "точка с запятой". Вероятно отсутсвие пробела приводит к "склеиванию" строк, т.е., например, фрагмент

...
SUM(IIF(BETWEEN(Frequency,0.1,1),1,0)) as interval_7;
FROM ...

После компиляции и "вытягивании" в одну строку принял вид

... SUM(IIF(BETWEEN(Frequency,0.1,1),1,0)) as interval_7FROM ...

Т.е. ключевое слово FROM оказалось не обрамлено пробелами (нет пробела между interval_7 и FROM). Т.е. анализатор его не увидел и посчитал всю команду синтаксически некорректной.




------------------
Ratings: 0 negative/0 positive
Re: Можно или нет?
Игорь Л.

Сообщений: 164
Откуда: Евпатория
Дата регистрации: 26.11.2003
Нет, дело не в этом, там же есть переносы строк - это то же разделитель...
Здесь дело в порядке следования слов в операторе SELECT - насколько я знаю, порядок здесь критичен
Скорее всего здесь бьется GROUP BY должна находиться перед INTO ....




------------------
И все мы делаем! Козьма Прутков
Ratings: 0 negative/0 positive
Re: Можно или нет?
rusl
Автор

Сообщений: 200
Откуда: СПб
Дата регистрации: 01.02.2005
Ошибка не появляется. Но...

Странная штука выходит. Вроде все сработало но как то странно.
Честно говоря пока еще не понял что Фокс посчитал, но похоже что то не то...
Хотя обидно, ведь все вроде правильно...

По идее сумма всех интервалов для каждого слова должна равняться 19 (так как у меня 19 файлов). Видимо я где то ошибся. Может в цикле. Надо поразбираться. Спасибо всем за участие
http://www.rusl.ru/img/fox-screen9.gif

Цитата:
Скорее всего здесь бьется GROUP BY должна находиться перед INTO ....
Посмотрел в синтаксис SELECT, GROUP BY стоит после INTO... Так что скорее всего глючило из-за амперсанта перед названием курсора.

FUNCTION freq_intervals
LOCAL lcFileName
SELECT TablesOfTheme
SCAN lcFileName = TablesOfTheme.TableName
IF FILE (m.lcFileName)
IF USED(m.lcFileName)=.F.
USE (m.lcFileName) IN 0
ELSE
SELECT (m.lcFileName)
ENDIF
ENDIF
SELECT ;
SubWord, COUNT(*) as interval_0, ;
SUM(IIF(BETWEEN(Frequency,0,0.000000999),1,0)) as interval_1, ;
SUM(IIF(BETWEEN(Frequency,0.000001,0.00009999),1,0)) as interval_2, ;
SUM(IIF(BETWEEN(Frequency,0.00001,0.000099999),1,0)) as interval_3, ;
SUM(IIF(BETWEEN(Frequency,0.0001,0.000999999),1,0)) as interval_4, ;
SUM(IIF(BETWEEN(Frequency,0.001,0.009999999),1,0)) as interval_5, ;
SUM(IIF(BETWEEN(Frequency,0.01,0.099999999),1,0)) as interval_6, ;
SUM(IIF(BETWEEN(Frequency,0.1, 1),1,0)) as interval_7 ;
FROM (m.lcFileName) ;
INTO CURSOR lcTableInterval NOFILTER ;
GROUP BY SubWord
ENDSCAN
RETURN



Отредактировано (25.02.05 23:25)


------------------
Ratings: 0 negative/0 positive


Извините, но у вас нет прав для того, чтобы оставлять сообщения в этом форуме.

On-line: 5 (Гостей: 5)

© 2000-2024 Fox Club 
Яндекс.Метрика