2017-11-11 120 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;