Как превратить SQL-запрос в функцию SQL - PullRequest
0 голосов
/ 15 марта 2012

Итак, у меня есть следующий код SQL, который вычисляет корреляцию Пирсона между оценками двух пользователей:

 select  @u1avg:=avg(user1_rating), 
    @u2avg:=avg(user2_rating), 
    @u1sd:=stddev(user1_rating),
    @u2sd:=stddev(user2_rating)
    from
(select r1.userId as User1_id,r1.rating as User1_rating,
        r2.userId as User2_id,r2.rating as User2_rating

from mydb.ratings r1 join mydb.ratings r2 on r1.itemId = r2.itemid 
where r1.userId=1 and r2.userId=2) sample;


select (1/(count(r1.rating-1)))*sum(((r1.rating-@u1avg)/@u1sd)*((r2.rating-@u2avg)/@u2sd))*(count(r1.rating)/(1+count(r1.rating)))

from mydb.ratings r1 join mydb.ratings r2 on r1.itemId = r2.itemid 
where r1.userId=1 and r2.userId=2;

Я хотел бы превратить это в функцию, например, corr (A, B), любая помощь будетбыть полезным.

Проблема, которую я получаю, заключается в том, что там, где написано sample , говоря, что не разрешено, или что-то в этом роде, однако, если я удаляю sample , я получаю сообщение об ошибке, в котором говорится, что каждая таблица должнаиметь псевдоним.

1 Ответ

1 голос
/ 15 марта 2012

Я думаю, что вы можете покончить с производной таблицей в первом запросе, который приведет к этой конкретной ошибке -

SELECT
    @u1avg:=avg(r1.rating),
    @u2avg:=avg(r2.rating),
    @u1sd:=stddev(r1.rating),
    @u2sd:=stddev(r2.rating)
FROM mydb.ratings r1
INNER JOIN mydb.ratings r2
    ON r1.itemId = r2.itemId
WHERE r1.userId=1
AND r2.userId=2;

SELECT (1/(COUNT(r1.rating-1)))*SUM(((r1.rating-@u1avg)/@u1sd)*((r2.rating-@u2avg)/@u2sd))*(COUNT(r1.rating)/(1+COUNT(r1.rating)))
FROM mydb.ratings r1
INNER JOIN mydb.ratings r2
    ON r1.itemId = r2.itemid
WHERE r1.userId=1
AND r2.userId=2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...