这是一个包含三列的表: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
如何编写查询以获取它?
答案 0 :(得分:2)
T-SQL / SQL Server
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;
答案 1 :(得分: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
哦,这几乎与之前的答案完全相同。正如它首先发布的那样,如果您有意接受这一点,请接受它。
答案 2 :(得分: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', ...)
外部查询中的。