【问题标题】:Build adjacency matrix from list of weighted edges in BigQuery从 BigQuery 中的加权边列表构建邻接矩阵
【发布时间】:2016-10-15 23:03:52
【问题描述】:

相关问题: 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)

但是这个查询看起来太贵了,谁能给我一个例子?

谢谢

【问题讨论】:

    标签: matrix google-bigquery transpose


    【解决方案1】:

    除非我遗漏了什么 - 它与您引用的帖子非常相似

    第 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  
    

    【讨论】:

    • 啊,是的,你说得对,这很相似,我认为应该从子查询中提取评级..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多