:: Visual Foxpro, Foxpro for DOS
SQL-запрос 2. Можно ли одним запросом?
rusl
Автор

Сообщений: 200
Откуда: СПб
Дата регистрации: 01.02.2005
Нужна таблица, отсортированная хитрым образом. Сейчас есть курсор (filenameid - id документа, shingles - определенные числа, коих у каждого документа штук 50):
CREATE CURSOR (Shi1) (filenameid c (10), shingles n(10), shingt m)
и из него необходимо получить таблицу TABLE (ShinglesFN) (fnameid1 N(10), fnameid2 N(10), sim N(12,10)), где:

fnameid1 N(10) - id одного документа
fnameid2 N(10) - id второго документа
sim N(12,10) - коэфициент равный отношению количества одинаковых для обоих документов чисел shingles (часть этих чисел у двух документов может совпадать, а другая часть нет) к сумме всех чисел shingles обоих документов.

Например у doc_1 shingles будут:
1
2
4
а у doc_2:
1
2
3
4
(тоесть 3 общих числа shingles, а всего их 7. sim=3/7)

тогда необходимо получит строку таблицы:

doc_1, doc_2, 3/7

Можно ли это сделать одним запросом?
Ratings: 0 negative/0 positive
Re: SQL-запрос 2. Можно ли одним запросом?
ssa

Сообщений: 13008
Откуда: Москва
Дата регистрации: 23.03.2005
Версия лисы? В 9-ке можно, но запрос не совсем маленький будет.
Ratings: 0 negative/0 positive
Re: SQL-запрос 2. Можно ли одним запросом?
rusl
Автор

Сообщений: 200
Откуда: СПб
Дата регистрации: 01.02.2005
8-ка
Ratings: 0 negative/0 positive
Re: SQL-запрос 2. Можно ли одним запросом?
rusl
Автор

Сообщений: 200
Откуда: СПб
Дата регистрации: 01.02.2005
http://india.ru/boards/sml/nomail.gif

Неужели вообще нет идей?

Понимаю что задача нетривиальная, но все же? А то вчера весь вечер парился, но так ничего дельного и не сделал. Есть идея использовать seek, но неужели SQL-запросом нельзя?
Ratings: 0 negative/0 positive
Re: SQL-запрос 2. Можно ли одним запросом?
Hel!Riser

Сообщений: 10452
Откуда: Нижний Новгород
Дата регистрации: 11.03.2001
вопщем-то тоже было фчера кинулся сочинять, но прочитаф условие повнимательней мой запрос не пошел. Поэтому идейка следущая - создать запрос с UDF, по образу и подобию, forum.foxclub.ru Т.е собрать в 2-х разных полях возрастающие числа... Далее для выяснения скока пофтороф - травим STRTRAN() и разница по модулю - тво:е делимое ну и далее собсна разделить это
блин долгий ответ получаеца у меня чем длиней. тем запутаней




------------------
Осторожно - глисты!
Ratings: 0 negative/0 positive
Re: SQL-запрос 2. Можно ли одним запросом?
rusl
Автор

Сообщений: 200
Откуда: СПб
Дата регистрации: 01.02.2005
М-м-м... Побежал обдумывать
Ratings: 0 negative/0 positive
Re: SQL-запрос 2. Можно ли одним запросом?
Бураков Сергей

Сообщений: 280
Откуда: Calgary
Дата регистрации: 07.02.2005
Попробуй так:
CREATE CURSOR t (id n(3),num n(3))
INSERT INTO t (id,num) VALUES (1,1)
INSERT INTO t (id,num) VALUES (1,2)
INSERT INTO t (id,num) VALUES (1,3)
INSERT INTO t (id,num) VALUES (1,4)
INSERT INTO t (id,num) VALUES (2,1)
INSERT INTO t (id,num) VALUES (2,2)
INSERT INTO t (id,num) VALUES (2,3)

SELECT a.id,b.id,COUNT(*)/(c.sum+d.sum) FROM (t a INNER JOIN t b ON a.num=b.num AND a.id<b.id ) ;
INNER JOIN (SELECT COUNT(*) as sum,id from t GROUP BY id) c ON c.id=a.id ;
INNER JOIN (SELECT COUNT(*) as sum,id from t GROUP BY id) d ON d.id=b.id ;
GROUP BY a.id,b.id,c.id,c.sum,d.id,d.sum
Ratings: 0 negative/0 positive
Re: SQL-запрос 2. Можно ли одним запросом?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi Сергей!

У него 8-ка, там это не прокатит
Хотя "доработать" под 8-ку этот запрос (выделив в отдельный процесс подсчёт
"общего числа" записей) IMHO не составляет никакого труда.




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: SQL-запрос 2. Можно ли одним запросом?
rusl
Автор

Сообщений: 200
Откуда: СПб
Дата регистрации: 01.02.2005
to Бураков Сергей

Позвал пэхэписта, тот посмотрел на запрос: "Ни..я себе! Это сколько ж надо выпить, чтоб написать такой запрос. Я б не додумался."

Но на второй строке запроса выдает синтаксическую ошибку.


to Igor Korolyov

А почему в 8-ке не катит?

Цитата:
Хотя "доработать" под 8-ку этот запрос (выделив в отдельный процесс подсчёт
"общего числа" записей) IMHO не составляет никакого труда.

А не подскажите как?
А то получается уж слишком:
CREATE CURSOR sim (doc1 n(3), doc2 n(3), doc1_count n(3), doc2_count n(3))
INSERT INTO sim;
SELECT a.id as doc1, b.id as doc2, 0, 0 FROM (t a INNER JOIN t b ON a.num=b.num AND a.id<b.id )
CREATE CURSOR counts (doc_id n(3), kolvo n(3))
INSERT INTO counts;
SELECT id as doc_id, count(*) FROM t GROUP BY id
CREATE CURSOR sim2 (doc1 n(3), doc2 n(3), doc1_count n(3), doc2_count n(3))
INSERT INTO sim2;
SELECT sim.doc1, sim.doc2, counts.kolvo as doc1_count, 0 FROM sim, counts WHERE sim.doc1 = counts.doc_id
CREATE CURSOR sim3 (doc1 n(3), doc2 n(3), doc1_count n(3), doc2_count n(3))
INSERT INTO sim3;
SELECT sim2.doc1, sim2.doc2, sim2.doc1_count, counts.kolvo as doc2_count FROM sim2, counts WHERE sim2.doc2 = counts.doc_id
SELECT doc1, doc2, count(*) / (doc1_count + doc2_count), count(*) from sim3 GROUP BY doc1, doc2
Ratings: 0 negative/0 positive
Re: SQL-запрос 2. Можно ли одним запросом?
ssa

Сообщений: 13008
Откуда: Москва
Дата регистрации: 23.03.2005
rusl писал(а):
Цитата:
to Бураков Сергей
Позвал пэхэписта, тот посмотрел на запрос: "Ни..я себе! Это сколько ж надо выпить, чтоб написать такой запрос. Я б не додумался."


Это, батенька, еще простенький И при этом я, заметь, совсем не пью

Цитата:
Но на второй строке запроса выдает синтаксическую ошибку.


to Igor Korolyov

А почему в 8-ке не катит?


Потому что для 9-ки. Там сняты многие ограничения на количество и места вставки вложенных запросов.
Ratings: 0 negative/0 positive
Re: SQL-запрос 2. Можно ли одним запросом?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi rusl!

Ну незнание SQL не есть положительная черта программиста... Так что гордится тому господину нечем - пускай лучше почитает умных книжек по SQL-ю.

Для 8-ки:
* Делай раз
SELECT a.id AS id1, ;
b.id AS id2, ;
COUNT(*) AS cnt_num ;
FROM t a INNER JOIN t b ;
ON a.num=b.num AND ;
a.id < b.id ;
GROUP BY a.id, b.id ;
INTO CURSOR csr1
* Делай два
SELECT id1, ;
id2, ;
0.0000000000 + 1/SUM(1/cnt_num) as sim ;
FROM csr1 INNER JOIN t ;
ON t.id = csr1.id1 OR ;
t.id = csr1.id2 ;
GROUP BY 1, 2 ;
INTO CURSOR csr2
BROWSE




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: SQL-запрос 2. Можно ли одним запросом?
Бураков Сергей

Сообщений: 280
Откуда: Calgary
Дата регистрации: 07.02.2005
Извиняюсь, не заметил, что у меня была девятка запущена.
А вообще, принципиально ли, чтобы это был именно один SQL-запрос. В общем случае программа работает быстрее, чем запрос. Достоинство запроса в том, что его писать быстрее, ну, может еще, если создаешь представление. Хотя, когда я начинал еще SQL изучать, то на написание одного запроса по паре дней уходило.
Ratings: 0 negative/0 positive
Re: SQL-запрос 2. Можно ли одним запросом?
Бураков Сергей

Сообщений: 280
Откуда: Calgary
Дата регистрации: 07.02.2005
На восьмерке можно одним запросом при помощи собственной функции:
CREATE CURSOR t (id n(3),num n(3))
INSERT INTO t (id,num) VALUES (1,1)
INSERT INTO t (id,num) VALUES (1,2)
INSERT INTO t (id,num) VALUES (1,3)
INSERT INTO t (id,num) VALUES (1,4)
INSERT INTO t (id,num) VALUES (2,1)
INSERT INTO t (id,num) VALUES (2,2)
INSERT INTO t (id,num) VALUES (2,3)

SELECT a.id,b.id,COUNT(*)/(nsum(a.id,b.id)) FROM (t a INNER JOIN t b ON a.num=b.num AND a.id<b.id ) GROUP BY a.id,b.id

FUNCTION nsum
LPARAMETERS a,b
SELECT t
COUNT FOR id=a OR id=b TO s
RETURN s
Ratings: 0 negative/0 positive
Re: SQL-запрос 2. Можно ли одним запросом?
rusl
Автор

Сообщений: 200
Откуда: СПб
Дата регистрации: 01.02.2005
to Бураков Сергей
В принципе конечно одним запросом необязательно. Но не одним у меня не очень получилось (см. код выше 9 сообщение). А 9-ку мне нигде в Питере не найти

to Igor Korolyov
Круто, работает! Вроде все верно считает.
Ratings: 0 negative/0 positive
Re: SQL-запрос 2. Можно ли одним запросом?
Бураков Сергей

Сообщений: 280
Откуда: Calgary
Дата регистрации: 07.02.2005
Если халявный быстрый Интернет, скачай на mail.ru , имя VFP9 пароль VFP9.
Если нет, позвони мне 349-64-89 вечером, я на Комендантском живу.
Ratings: 0 negative/0 positive
Re: SQL-запрос 2. Можно ли одним запросом?
rusl
Автор

Сообщений: 200
Откуда: СПб
Дата регистрации: 01.02.2005
А сколько весит? И как это скачать на mail.ru? Это же почта.
Ratings: 0 negative/0 positive
Re: SQL-запрос 2. Можно ли одним запросом?
Бураков Сергей

Сообщений: 280
Откуда: Calgary
Дата регистрации: 07.02.2005
300 M.
А ты ее скачиваешь как почту, как адресат с именем VFP9 и таким же паролем.
Ratings: 0 negative/0 positive
Re: SQL-запрос 2. Можно ли одним запросом?
ssa

Сообщений: 13008
Откуда: Москва
Дата регистрации: 23.03.2005
И не забудь убрать галочку в своей почтовке "Удалать сообщения с сервера" или что-то подобное.
Ratings: 0 negative/0 positive
Re: SQL-запрос 2. Можно ли одним запросом?
rusl
Автор

Сообщений: 200
Откуда: СПб
Дата регистрации: 01.02.2005
У меня метр около 2-х рублей. Получается дороговато 600 р.
Ratings: 0 negative/0 positive
Re: SQL-запрос 2. Можно ли одним запросом?
ssa

Сообщений: 13008
Откуда: Москва
Дата регистрации: 23.03.2005
И что, даже пустую болванку CD-R послать, чтоб записали и прислали обратно, некому? У меня, помниться, в свое время 8-й фокс по Белоруссии таким способом лихо разошелся
Ratings: 0 negative/0 positive


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

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

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