SQL中平均计数的高效查询

SQL中平均计数的高效查询,sql,average,Sql,Average,我有一张桌子: id age tag 1 26 green 1 26 blue 2 28 yellow 3 45 red 4 40 blue 4 40 green 5 50 red 我需要找到每个年龄组不同标签数量的平均和标准偏差(我用CASE-WHEN编码了这个) 例如: average_age average_tags sd_tags age_group 26.7 1.5 0.1 25-34 40 2

我有一张桌子:

id age tag 
1  26  green
1  26  blue
2  28  yellow
3  45  red
4  40  blue
4  40  green
5  50  red
我需要找到每个年龄组不同标签数量的平均和标准偏差(我用CASE-WHEN编码了这个)

例如:

average_age average_tags sd_tags age_group
26.7        1.5          0.1     25-34
40          2            0       35-44
45          1            0.01    44+  
是否有一种方法可以更有效地计算标记的平均计数,并避免在子查询中重复案例代码以提高效率/可读性

SELECT  
     AVG(age) as average_age,
    AVG(countField) as average_spread,
    STDDEV(countField) as sd_spread,
    CASE
            WHEN v.age BETWEEN 25 AND 34 THEN '25-34'
    
            WHEN v.age BETWEEN 35 AND 44 THEN '35-44'
    
            ELSE '44+' 
        END AS age_group,
    FROM  vid v
    
         (
         SELECT AVG(v.age),
          COUNT(DISTINCT(p.tag)) AS countField,
          CASE
    
            WHEN v.age BETWEEN 25 AND 34 THEN '25-34'
    
            WHEN v.age BETWEEN 35 AND 44 THEN '35-44'
    
            ELSE '44+' 
    
        END AS age_group,
          FROM  vid v
    
           GROUP BY age_group
           ) as q WHERE age IS NOT NULL 
           GROUP BY age_group ORDER BY age_group;
您可以使用此查询

select AVG(T.Age) as average_age,AVG(countField) as average_spread,age_group 
            from (select v.Age,COUNT(DISTINCT(v.Tag)) as countField,CASE    
            WHEN v.age BETWEEN 25 AND 34 THEN '25-34'
            WHEN v.age BETWEEN 35 AND 44 THEN '35-44'
            ELSE '44+' END AS age_group 
            from VID v
            group by v.Age) T
            WHERE age IS NOT NULL 
            GROUP BY age_group ORDER BY age_group;

您上面发布的查询甚至无法编译。请编辑您的问题并包括当前的工作查询。我不理解您的要求。您是否在询问各年龄组中个人的标准偏差?还是所有年龄组平均值的标准差?样本数据和期望的结果通常有助于解释。