2015-04-05 32 views
0

我有一个含有userid,productid和reviewScore的sql表,它拥有超过1000万条记录。我们可以想象,userid和productid组合是独一无二的。我需要找到100 * 100的用户标识和产品ID与他们的评论分数矩阵。100个用户组和100个产品的sql查询

样本输入表 - 这里的第一个问题是需要确定共有100个用户标识和产品组合中的1000万行,其中包含评论并将其转换为基于矩阵形式。

productId将形成动态主元素。

输入 表1

UserID ProductId ReviewScore 
User1 Product1 1 
User1 Product2 2 
User1 Product3 1 
User1 Product4 3 
User1 Product5 5 
User2 Product1 3 
User2 Product2 4 
User2 Product3 5 
User2 Product4 2 
User2 Product5 5 
User3 Product1 1 
User3 Product2 3 
User3 Product3 5 
User3 Product4 3 
User3 Product5 4 
User4 Product1 3 
User4 Product2 3 
User4 Product3 3 
User4 Product4 4 
User4 Product5 4 
User5 Product1 2 
User5 Product2 2 
User5 Product3 2 
User5 Product4 3 
User5 Product5 3 

输出我需要。

UserId Product1 Product2 Product3 Product4 Product5 
User1 1   2   1   3    5 
User2 3   4   5   2    5 
User3 1   3   5   3    4 
User4 3   3   3   4    4 
User5 2   2   2   3    2 

这里的输出应该是100 * 100 usesrid *产品ID,评分为值。这个想法是有最小稀疏或0值。

我必须在sql server中编写相同的查询。 任何帮助表示赞赏。

+0

这100个用户应在结果呢?你如何从10毫米的行中选择它们? – 2015-04-05 18:25:00

+0

我们可以选择100个普通用户标识,它们给出了普通100个产品的评分。 – James 2015-04-05 18:28:25

+0

@ giorgi 100个用户评分为至少100种常用产品。如果计数超过我们可以获得前100名。 – James 2015-04-05 18:30:02

回答

1

使用​​内dynamic sql

DECLARE @prods AS NVARCHAR(MAX) 
DECLARE @query AS NVARCHAR(MAX) 

select @prods = STUFF((SELECT ',' + QUOTENAME(ProductId) 
        from tab 
        --where limit the products here 
        group by ProductId 
        order by ProductId 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT * from 
      (
       select UserID, ProductId, ReviewScore 
       from tab --here also you can limit the products and users by where clause 
      ) x 
      pivot 
      (
       sum(ReviewScore) 
       for ProductId in (' + @prods + ') 
      ) p ' 

EXECUTE(@query) 

Fiddle Demo

+0

感谢Farheg。我运行了这个查询,并且从最后5分钟开始仍在运行。我在桌上有超过6000万条记录,所以我需要首先缩小这些记录。在这里您此块的东西((SELECT '' + QUOTENAME(产品编号) 从标签 组,按ProductID 顺序,按ProductID FOR XML PATH( ''),TYPE ).value的( '',“NVARCHAR(MAX )') ,1,1,'') 花费很多时间。你的方法是对的。一旦我测试它,我会标记答案。 – James 2015-04-05 19:07:37

+0

如果我有25个记录的5 * 5正确映射,您的答案是正确的。你能否给出解决方案,我应该如何确定100个userid * 100产品的映射,这些产品已经给出了来自这么多行的评论分数。 – James 2015-04-05 19:10:36

+0

欢迎您,您更清楚如何处理6000万条记录以获得更好的性能 – jfun 2015-04-05 19:10:39