从BigQuery中的加权边列表构建邻接矩阵

时间:2016-06-15 02:31:27

标签: matrix google-bigquery transpose

相关问题: How to create dummy variable columns for thousands of categories in Google BigQuery

我有一个加权边列表,这是一个用户项评级列表,它看起来像这样:

| userId | itemId | rating
| 001    | 001    | 5.0
| 001    | 002    | 4.0
| 002    | 001    | 4.5
| 002    | 002    | 3.0

我想将此加权边列表转换为邻接矩阵:

| userId | item001 | item002
| 001    | 5.0     | 4.0
| 002    | 4.5     | 3.0

根据this post,我们可以分两步完成,第一步是提取矩阵条目的值以生成查询,第二步是运行从中生成的查询第一步。

但我的问题是如何提取评级值并使用IF()声明中的评级值?我的直觉是在IF()语句中放置一个嵌套查询,如:

IF(itemId = blah, 
                 (select rating 
                  from mytable 
                  where 
                    userId = blahblah 
                    and itemId = blah), 
                 0)

但是这个查询看起来太贵了,有人可以举个例子吗?

由于

1 个答案:

答案 0 :(得分:2)

除非我遗漏了某些东西 - 它与您引用的帖子非常相似

  

第1步 - 生成查询

SELECT 'SELECT userID, ' + 
   GROUP_CONCAT_UNQUOTED(
    'SUM(IF(itemId = "' + STRING(itemId) + '", rating, 0)) AS item' + STRING(itemId)
   ) 
   + ' FROM YourTable GROUP BY userId'
FROM (
  SELECT itemId 
  FROM YourTable  
  GROUP BY itemId
) 
  

第2步 - 运行生成的查询

SELECT 
  userID, 
  SUM(IF(itemId = "001", rating, 0)) AS item001,
  SUM(IF(itemId = "002", rating, 0)) AS item002 
FROM YourTable 
GROUP BY userId
  

按预期结果

userID  item001 item002  
001     5.0     4.0  
002     4.5     3.0