繁体   English   中英

在同一查询中使用SUM和DISTINCT

[英]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

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

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

我不知道 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 您将按useridactivity_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM