【问题标题】:write sql query to calculate product编写sql查询计算产品
【发布时间】:2018-04-24 10:07:38
【问题描述】:

这是一个包含三列的表:user_id、product_id、rating,

这是桌子:

user_id    product_id    rating
u0         p0            3
u0         p1            2
u1         p0            1
u1         p1            4
u2         p0            2
u2         p1            3

如果两个不同的客户都对相同的两种产品进行评分,则计算其评分的点积如下: u0 和 u1 都评价了产品 p0 和 p1,结果应该是:3 * 1 + 2 * 4 = 11

和结果表:

u0  u1  3*1+2*4=11 
u0  u2  3*2+2*3=12 
u1  u2  1*2+4*3=14 

如何编写查询来获取它?

【问题讨论】:

  • 选择不同的 MySQL 和 SQL-Server 之一。
  • @roastedpotato:是否有任何附加条件,例如将其限制为某些用户/产品?另外,你真的需要第一列和第二列有 user_ids 吗?
  • 你不清楚。你没有解释。什么是输入的函数? (为什么是示例输入的输出?如果有其他用户和产品怎么办?什么“两个产品”?)另外,你试过什么?请阅读minimal reproducible example并采取行动。
  • 这只是最不清晰的一点。解释如何将输入映射到向量。例如,您的意思不是“将值存储为 [a] 稀疏向量”,而是指“该表通过 ... 稀疏表示两个向量 ....”。例如(数学一维)向量通常是有序列表,并且根据您的公式和提到的点积,它们是用户和产品向量,但表格没有排序,那么这些因素是如何配对的?使用英语写出足够完整的句子,并使用适当的标点符号和语法,使用足够多的词来指代事物来解释您的意思。

标签: mysql sql sql-server sql-server-2008 tsql


【解决方案1】:

T-SQL/SQL 服务器

DECLARE @DataSource TABLE
(
    [user_id] VARCHAR(2)
   ,[product_id] VARCHAR(2)
   ,[rating] DECIMAL(9,2)
);


INSERT INTO @DataSource ([user_id], [product_id], [rating])
VALUES ('u0', 'p0', 3)
      ,('u0', 'p1', 2)
      ,('u1', 'p0', 1)
      ,('u1', 'p1', 4);

WITH DataSource AS
(
    SELECT [product_id]
          ,EXP(SUM(LOG([rating]))) AS [value]
    FROM @DataSource
    GROUP BY [product_id]
)
SELECT SUM([value])
FROM DataSource;

【讨论】:

    【解决方案2】:

    所需结果的前两列没有意义 - 如果有多个用户怎么办?

    所以,忽略那一点......

    SELECT ROUND(SUM(subtotal)) total 
      FROM
         ( SELECT product_id
         , EXP(SUM(LOG(rating))) subtotal
      FROM my_table
     GROUP 
       BY product_id
      ) n;
    

    同样的Sqlfiddle:http://sqlfiddle.com/#!9/3c9dac/3

    哦,这几乎与之前的答案完全相同。正如它首先发布的那样,如果您愿意接受这个,那就接受那个吧。

    【讨论】:

    • 你们都是用mysql写的,可以用t-sql写吗?
    • 不知道tsql,不能说。
    【解决方案3】:

    MySQL 解决方案:

    SELECT SUM(m.product_rating)
    FROM (
        SELECT EXP(SUM(LOG(COALESCE(rating,1))) AS product_rating
        FROM table
        GROUP BY product_id
        /*this query multiplies the ratings by product*/
    ) AS m
    GROUP BY NULL
    

    编辑

    如果您只想要某些产品,请添加

    WHERE product_id IN('p0', 'p1', ...)
    

    在内部查询中。 如果您只想要某些用户,请添加

    WHERE user_id IN('u0', 'u1', ...)
    

    在外部查询中。

    【讨论】:

    • 请不要回答不清楚的问题。它只是促进了糟糕的问题和糟糕的答案以及冗长的讨论。评论和反对并关闭投票,直到他们清楚为止。你没有代表的事情,不要做。
    猜你喜欢
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多