MYSQL计算列中特定出现的平均值

时间:2016-07-02 00:47:57

标签: mysql

我需要计算列中给定值的数据集中出现的平均值。我做了一个简单的例子,但在我当前的数据库中包含大约2个内部联接,以将其减少到100k记录。我需要为10列执行以下select distinct语句。

我当前的设计强制每列的内连接。另一个限制是我需要在此示例中为每个名称执行至少50-100行。

我需要找出一种有效的方法来计算这些值,而不会在快速查询时使用太多资源。

http://sqlfiddle.com/#!9/c2378/3

我的预期结果是:

Name    |  R Avg dir    |  L Avg dir 1   |  L Avg dir 2   |  L Avg dir 3
A          0               .5                 .25            .25

创建表格查询:

 CREATE TABLE demo
    (`id` int, `name` varchar(10),`hand` varchar(1), `dir` int)
;

INSERT INTO demo
    (`id`, `name`, `hand`, `dir`)
VALUES
    (1, 'A', 'L', 1),
    (2, 'A', 'L', 1),
    (3, 'A', 'L', 2),
    (4, 'A', 'L', 3),
    (5, 'A', 'R', 3),
    (6, 'A', 'R', 3)
;

示例查询:

SELECT distinct name, 
 COALESCE(( (Select count(id) as 'cd' from demo where hand = 'L' AND dir = 1) /(Select count(id) as 'fd' from demo where hand = 'L')),0) as 'L AVG dir'
FROM
  demo
  where hand = 'L' AND dir = 1 AND name = 'A'

1 个答案:

答案 0 :(得分:1)

一种选择是使用conditional aggregation

SELECT name, 
       count(case when hand = 'L' and dir = 1 then 1 end) / 
            count(case when hand = 'L' then 1 end) L1Avg,
       count(case when hand = 'L' and dir = 2 then 1 end) /
            count(case when hand = 'L' then 1 end) L2Avg,
       count(case when hand = 'L' and dir = 3 then 1 end) /
            count(case when hand = 'L' then 1 end) L3Avg,
       count(case when hand = 'R' and dir = 3 then 1 end) /
            count(case when hand = 'R' then 1 end) RAvg
FROM demo
WHERE name = 'A'
GROUP BY name

请注意,我并非100%确定您希望RAvg为0的原因 - 我认为您的意思是100%。如果没有,您可以相应调整上述内容。