MySQL查询中的DISTINCT和AVG

时间:2018-10-04 16:54:40

标签: mysql database average

我有这个mysql查询:

SELECT round(AVG(DISTINCT points),0) as PM
FROM data
WHERE points != 0

在数据数据库中,我有几个用户属于不同的地区。每个用户可以根据需要位于任意多个区域,但是每个区域的积分都相同,因此,我们可以:

User , District , Points
   1 ,        1 ,     20 
   1 ,        3 ,     20 
   1 ,       21 ,     20 
   2 ,        3 ,     10
   2 ,        7 ,     10

我想提取上表的平均点数,但是无论每个用户位于多少个区中,都只计算一次。

对于我的查询,我只会得到那些分数不同的查询,但是,例如,如果我有一个拥有10点的User 3,查询将返回:15(20 + 10 = 30/2 = 15),而不是正确的值:13(20 + 10 + 10 = 40/3 = 13,3333)。

有什么帮助吗?

非常感谢!

2 个答案:

答案 0 :(得分:0)

在查询结束时您是否尝试过GROUP BY

Working Online Sample Demo at SQLFiddle

构建模式...

CREATE TABLE UserPoints (
  id INT(11) NOT NULL AUTO_INCREMENT,
  Userid INT(11) NOT NULL DEFAULT 0,
  Districtid INT(11) NOT NULL DEFAULT 0,
  PointsCount INT(11) NOT NULL DEFAULT 0,
  PRIMARY KEY (id)
);

插入一些示例数据...

INSERT INTO UserPoints (Userid, Districtid, PointsCount) VALUES (1, 1, 10);
INSERT INTO UserPoints (Userid, Districtid, PointsCount) VALUES (1, 2, 20);
INSERT INTO UserPoints (Userid, Districtid, PointsCount) VALUES (2, 1, 12);

然后选择GROUP BY ...

SELECT Userid, AVG(PointsCount) FROM UserPoints GROUP BY Userid;

结果...

Userid  AVG(PointsCount)
1       15
2       12

答案 1 :(得分:0)

  • 首先,使用group by获取Derived table中每个用户的积分。
  • 现在,使用派生表计算平均值。您现在不需要使用Distinct

尝试(假设用户由列user_id表示-如果不同则进行更改):

SELECT ROUND(AVG(`dt`.`user_points`),0) as PM 
FROM 
(
  SELECT `user_id`, 
         MAX(`points`) AS `user_points`  
  FROM `data`
  WHERE `points` != 0 
  GROUP BY `user_id` 
) AS `dt`