1

因此,我正在尝试构建一个查询,该查询将向我显示对于每种类型的活动,哪些用户的得分最高。您可以在下面看到表格结构。每个活动都有一个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

我希望能够输出以下内容:

  1. 通话表现最佳 = 詹姆斯
  2. 会议表现最佳者 = Bob, James。

我事先不知道activity_typeid,因为它们是随机输入的,所以我想知道是否可以构建某种查询来计算每个 DISTINCT/UNIQUE activity_typeid的 SUM ?

提前非常感谢。

4

5 回答 5

2

你需要的是等价的解析函数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 | 用户名 |
|-----------------|---------|
| 8121 | 123,431 |
| 8765 | 第431章

这是两个查询的SQLFiddle演示

于 2013-10-03T08:11:47.690 回答
0

您必须使用该GROUP BY语句来计算每个用户和每个活动 typeid 的总和。尝试这样的事情:

SELECT userid, activity_typeid, SUM(activity_weight)
FROM table
GROUP BY userid, activity_typeid

然后将其用作子查询来确定每个 activity_typeid 的最佳执行者。

于 2013-10-03T07:55:18.667 回答
0

如果要使用聚合函数,则需要使用GROUP BY, 而不是DISTINCT. 您将按 和 分组useridactivity_typeid然后选择SUM(activity_weight)

于 2013-10-03T07:55:28.627 回答
0

当然,只需像这样使用 group by :

SELECT t.userid, t.activity_typeid, sum(t.activity_weight) 
FROM YOURTABLE t
GROUP BY t.userid, t.activity_typeid
于 2013-10-03T07:55:32.400 回答
0

查询以选择给定活动的(单个)最佳执行者:

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 名表演者,然后在代码中检查它们以查看您想要显示的内容(例如,如果两个人的分数相同)。

于 2013-10-03T07:57:01.347 回答