创建一个虚拟表s.t.列出合作者和两个人合作的次数

时间:2014-01-23 21:24:10

标签: sqlite

表1(t1)的模式:

t1(projectid integer, score integer)

表2(t2)的模式:

t2(id integer, unique_id integer, string_name text)

id应该引用一个projectid。得分直观地是项目的数字排名。 unique_id是人的数字id,string_name是人的名字。

我正在寻找创建一个虚拟表,使其具有此架构:

cg(id1, id2, avg_score, count)

id1,id2引用t2的unique_id,使得id1和id2处理2个或更多项目,平均分数大于或等于N(某个整数)。 count是id1和id2合作的项目数。

所以我开始:

 CREATE VIEW cg as SELECT unique_id as id1, unique_id as id2, avg(score) 
 as avg_score, count(projectid) as mcount from t1, t2 WHERE id1 != id2 
 GROUP BY projectid HAVING count(projectid) >=2 and avg(score) >= N.

但这似乎不对。所以一点点帮助会很好。出于测试目的,我让N = 15。

1 个答案:

答案 0 :(得分:0)

只给一个列两个名字不会给你不同的值;你必须从表的两个不同实例中选择它们。 使用GROUP BY projectid,每个组只能获得一个项目。

请改为尝试:

CREATE VIEW cg AS
SELECT p1.unique_id AS id1,
       p2.unique_id AS id2,
       AVG(prj1.score + prj2.score) / 2 AS avg_score,
       COUNT(*) AS count
FROM t2 AS p1
JOIN t2 AS p2 ON p1.id = p2.id AND
                 p1.unique_id < p2.unique_id
JOIN t1 AS prj1 ON p1.id = prj1.projectid
JOIN t1 AS prj2 ON p2.id = prj2.projectid
GROUP BY p1.unique_id,
         p2.unique_id
HAVING COUNT(*) >= 2
   AND AVG(prj1.score + prj2.score) / 2 >= N