sql - 电影评级数据库的新手 SQL 查询问题

标签 sql database sql-server-2005

我有一个只有一张表的数据库,如下所示:

UserID (int), MovieID (int), Rating (real)

userIDs 和 movieIDs 是很大的数字,但我的数据库只有许多可能值的样本(4000 个唯一用户和 3000 个唯一电影)

我要对其进行矩阵 SVD(奇异值分解),因此我想将此数据库作为有序数组返回。基本上,我想按顺序返回每个用户,对于每个用户,按顺序返回每部电影,然后返回该用户、电影对的评分,如果该用户未对特定电影评分,则返回 null。示例:

USERID | MOVIEID | RATING
-------------------------
99835   8847874    4
99835   8994385    3
99835   9001934    null
99835   3235524    2
           .
           .
           .
109834  8847874    null
109834  8994385    1
109834  9001934    null

etc

这样,我可以简单地将这些结果读入二维数组,适合我的 SVD 算法。 (任何其他将信息数据库放入简单的二维 float 组的建议都将不胜感激)

重要的是按顺序返回它,这样当我取回我的二维数组时,我将能够将这些值重新映射到相应的用户和电影以进行我的分析。

最佳答案

SELECT m.UserID, m.MovieID, r.Rating
    FROM (SELECT a.userid, b.movieid
              FROM (SELECT DISTINCT UserID FROM Ratings) AS a,
                   (SELECT DISTINCT MovieID FROM Ratings) AS b
         ) AS m LEFT OUTER JOIN Ratings AS r
         ON (m.MovieID = r.MovieID AND m.UserID = r.UserID)
    ORDER BY m.UserID, m.MovieID;

现已测试,似乎有效!

概念是创建 Ratings 表中的 UserID 值列表与 Ratings 表中的 MovieID 值列表的笛卡尔积(哎哟!),然后将该完整矩阵与 Ratings 表进行外连接(再次)收集评级值。

这是有效的。

这可能是有效的。

尽管只运行简单的数据选择,并在数据到达时安排填充数组,但您可能会做得更好。如果您有成千上万的用户和电影,您将返回数百万行,但其中大部分将有空值。您应该将传入数据视为稀疏矩阵的描述,首先将程序中的矩阵设置为全零(或其他默认值),然后从数据库中读取流并仅设置实际存在的行。

该查询基本上是微不足道的:

SELECT UserID, MovieID, Rating
    FROM Ratings
    ORDER BY UserID, MovieID;

关于sql - 电影评级数据库的新手 SQL 查询问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/319649/

相关文章:

sql - 如何找到访问SQL Server的用户名和机器名

sql-server - 全文搜索问题

sql - 将表变量与 xp_cmdshell 一起使用

sql - 无法连接到 SQL Server 2005

sql - MySQL - 查找时间重叠

mongodb - 确保索引 mongodb 时打开的文件过多

mysql - 更多表对数据库效率的影响 SQL

mysql - 无法通过一个查询更新多个记录(CASE/WHEN))

windows - 跨多个平台维护多个数据库

sql-server - SQL Server 索引 - HEAP 上的非聚集索引