【问题标题】:SQL maximum average of grouped itemsSQL 分组项的最大平均值
【发布时间】:2015-03-11 12:30:23
【问题描述】:

在线商店建模,用户可以在其中购买商品并评价他们购买的商品。有四张桌子

购买(用户,物品)

用户(用户 ID,名称)

费率(项目,评级)

商品(商品ID、描述、价格)

我想为每个用户返回一个他们没有购买但平均评分最高的商品的列表。

到目前为止,我构建的代码有点笨拙,但似乎完成了一半的工作:

SELECT U.UserID, U.name, I.ItemID, I.Description, AVG(R.Rating) AS avgRate
FROM Item I, User U, Rates R 
WHERE R.Item=I.ItemID 
AND NOT EXISTS 
(SELECT Item  FROM Buys B  WHERE I.ItemID = B.item and U.UserID = B.user) 
group by U.UserID, item,I.ItemID Order by U.UserID, avgRate DESC

这给了我以下输出:

UserID   name   ItemID  Decription           avgRate
1        Jones   5      Computing Textbook   5
1        Jones   11     Tennis Ball          3.5
1        Jones   12     Tennis Raquet        4
2        Brown   5      Computing Textbook   5
2        Brown   11     Tennis Ball          3.5
2        Brown   12     Tennis Raquet        4

但我希望通过输出为每个用户只选择一项,所以:

UserID  name    ItemID  Decription           avgRate
1       Jones   5       Computing Textbook   5
2       Brown   5       Computing Textbook   5

我尝试过限制排序,但它只给了我 1 行,并且您不能将 MAX() 函数与 AVG 一起使用...

【问题讨论】:

  • 您的标签不兼容
  • 在询问这样的 DBMS 问题时,最好只为 dbms tech 使用一个标签。即不要同时使用mysql和sql-server。这是因为不同的 DBMS 系统具有不同的语言和性能特征。它是哪一个? MySQL 还是 Microsoft SQL Server?
  • 谢谢,我使用的是 MYSQL 工作台,并没有意识到它们是不同的
  • @Helen 不要忘记接受答案
  • 对于同一用户的两种产品,avgRate 的最高平均值是否相同,如果是,那么选择最终为该用户显示哪一行的标准是什么,或者您会显示两个该用户在该实例中的行数?

标签: mysql sql


【解决方案1】:

假设对于您可能使用的同一用户,两种产品的最高平均值永远不会相同:

with cte1 (UserID,name,ItemID,Decription,avgRate)
as
(
SELECT U.UserID, U.name, I.ItemID, I.Description, AVG(R.Rating) AS avgRate
FROM Item I, User U, Rates R 
WHERE R.Item=I.ItemID 
AND NOT EXISTS 
(SELECT Item  FROM Buys B  WHERE I.ItemID = B.item and U.UserID = B.user) 
group by U.UserID, item,I.ItemID Order by U.UserID, avgRate DESC
)
,
cte2 (UserID,name,ItemID,Decription,avgRate,rank1) as
(
select * , rank() over (partition by name order by avgrate)from cte1
)
select UserID,name,ItemID,Decription,avgRate from cte2 where rank1 in
(
select max(rank1) from cte2 group by userid
) 
order by userid

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    • 2023-03-10
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多