2017-11-11 117 views
0

这里有一个表有三列:USER_ID,PRODUCT_ID,等级,写SQL查询来计算产品

这是表:

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 

如何编写查询来获取它?

+4

选择的MySQL和SQL-服务器这两者是不同的任何一个。 –

+0

@roastedpotato:是否有任何附加条件,如限制某些用户/产品?另外,你真的需要第一和第二列有user_ids吗? –

+2

你不清楚。你没有解释。什么是输入作为什么是输入的函数? (为什么是示例输入的输出?如果有其他用户和产品,那么这两个产品又是什么?)另外,你有什么尝试?请阅读并在[mcve]上采取行动。 – philipxy

回答

0

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', ...) 

+0

请不要回答不清楚的问题。它只是提出了很差的问题,差劲的答案和长时间的讨论评论&downvote&close投票,直到他们清楚。你没有代表,不这样做。 – philipxy

1

预期结果的前两列是没有意义的 - 如果有多个用户呢?

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

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

哦,这是早期的答案几乎如出一辙。因为它是首先发布的,如果你有意接受这个,请接受它。

+0

你们都在mysql中写过,是否可以在t-sql中写入? – roastedpotato

+0

不知道tsql,我不能说。 – Strawberry

2

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;