[英]using SUM and DISTINCT in the same query
因此,我试图构建一个查询,以针对每种活动向我显示哪些用户的得分最高。 您可以在下面看到表格strucutre。 每个活动都有一个activity_typeid ,每个活动都带有特定的activity_weight 。
在下面的示例中,Bob的通话得分为50分,会议的得分为100分。 詹姆斯在电话会议上获得100分,在会议上获得100分。
userid activity_typeid activity_weight
------------------------------------------------------------
123 (Bob) 8765 (calls) 50
123 (Bob) 8121 (meetings) 100
431 (James) 8765 (calls) 50
431 (James) 8121 (meetings) 100
431 (James) 8765 (calls) 50
我希望能够输出以下内容:
我不知道 activity_typeid是预先输入的,因为它们是随机输入的,所以我想知道是否可以构建某种查询来计算每个DISTINCT / UNIQUE activity_typeid的总和?
非常感谢。
您所需的等效于解析函数DENSE_RANK()
。 如果您需要每项活动的佼佼者,可以采用一种方法
SELECT a.activity_typeid, GROUP_CONCAT(a.userid) userid
FROM
(
SELECT activity_typeid, userid, SUM(activity_weight) activity_weight
FROM table1
-- WHERE ...
GROUP BY userid, activity_typeid
) a JOIN
(
SELECT activity_typeid, MAX(activity_weight) activity_weight
FROM
(
SELECT activity_typeid, userid, SUM(activity_weight) activity_weight
FROM table1
-- WHERE ...
GROUP BY userid, activity_typeid
) q
GROUP BY activity_typeid
) b
ON a.activity_typeid = b.activity_typeid
AND a.activity_weight = b.activity_weight
GROUP BY activity_typeid
在MySQL中模拟DENSE_RANK()
另一种方法是利用会话变量
SELECT activity_typeid, GROUP_CONCAT(userid) userid
FROM
(
SELECT activity_typeid, userid, activity_weight,
@n := IF(@g = activity_typeid, IF(@v = activity_weight, @n, @n + 1) , 1) rank,
@g := activity_typeid, @v := activity_weight
FROM
(
SELECT activity_typeid, userid,
SUM(activity_weight) activity_weight
FROM table1
-- WHERE ...
GROUP BY activity_typeid, userid
) q CROSS JOIN (SELECT @n := 0, @g := NULL, @v := NULL) i
ORDER BY activity_typeid, activity_weight DESC, userid
) q
WHERE rank = 1
GROUP BY activity_typeid
输出:
| ACTIVITY_TYPEID | USERID | |-----------------|---------| | 8121 | 123,431 | | 8765 | 431 |
这是两个查询的SQLFiddle演示
您必须使用GROUP BY
语句来计算每个用户和每个活动typeid的总和。 尝试这样的事情:
SELECT userid, activity_typeid, SUM(activity_weight)
FROM table
GROUP BY userid, activity_typeid
然后将其用作子查询,以确定每个activity_typeid的最佳执行者。
如果要使用聚合函数,则需要使用GROUP BY
而不是DISTINCT
。 您将按userid
和activity_typeid
分组,然后选择SUM(activity_weight)
。
当然,只需使用group by这样:
SELECT t.userid, t.activity_typeid, sum(t.activity_weight)
FROM YOURTABLE t
GROUP BY t.userid, t.activity_typeid
查询以选择给定活动的(单个)最佳表演者:
SELECT userid, activity_typeid, SUM(activity_weight)
FROM ?
WHERE activity_typeid = ?
GROUP BY userid
ORDER BY SUM(activity_weight) DESC
LIMIT 1
您可以更改LIMIT
以输出前5名或前10名表演者,然后在代码中检查他们,以查看要显示的表演者(例如,如果两个人的得分相同)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.