mysql - MYSQL 为每个不同的条目选择平均值
问题描述
我试图通过查询而不是在服务器端解决这个问题。
我有一张这样的桌子:
+----+-----------+--------+--------+
| ID | RateValue | Marker | Marked |
+----+-----------+--------+--------+
| 1 | 8 | USER1 | USER2 |
| 2 | 10 | USER2 | USER1 |
| 3 | 9 | USER3 | USER1 |
| 4 | 8 | USER1 | USER3 |
| 5 | 6 | USER2 | USER3 |
| 6 | 7 | USER3 | USER2 |
+----+-----------+--------+--------+
我想要一个查询返回每个标记用户的平均值。
USER1 标记在第 2 行和第 3 行,总数为 9.5 (9+10/2)。
USER2 标记在第 1 行和第 6 行,总数为 7.5。
到目前为止,我只是通过将其分为两个步骤来完成这项工作:获取所有唯一标记的用户:
SELECT DISTINCT Marked FROM reviews
然后获取每个用户的 AVG:
SELECT AVG(rateValue) FROM reviews WHERE Marked = ?
我试图将其结合起来,但它返回了我的总平均值:
SELECT Marked,AVG(rateValue) FROM reviews WHERE Marked IN (SELECT DISTINCT Marked FROM reviews)
但它返回了我的总平均值,我希望有一个查询返回每个不同标记用户的平均值。
解决方案
只需使用聚合:
select marked, avg(ratevalue)
from reviews
group by marked;
如果您想要平均值而不考虑列,则使用union all
unpivot 和聚合:
select user, avg(ratevalue)
from ((select marker as user, ratevalue
from reviews
) union all
(select marked as user, ratevalue
from reviews
)
) r
group by user;
这是通用 SQL。一些数据库有更有效的方法来反透视两列。
推荐阅读
- visual-studio - 无法加载 DLL 'Microsoft.WITDataStore32.dll' (TeamFoundation.WorkItemTracking) Visual Studio 2017
- sql-server - 行号 >100 且行号 < 200
- c++ - Writing memory violation error when using this
- azure - Publish web app without webjobs
- android - Making RecyclerView vertical
- android - 推送通知不适用于带有 release-apk 的 Android 7.0 (FCM)
- c# - DataAnnotation Localization Error when not translate
- android - 应用程序用户如何选择他是否喜欢在 android 中使用 firebase 接收通知
- javascript - 活动标签的动态定义
- javascript - setMonth 和 getMonth 不返回相同的值