SQL-如何在聚合操作期间获取每组重复次数最多的文本值?

Posted

技术标签:

【中文标题】SQL-如何在聚合操作期间获取每组重复次数最多的文本值?【英文标题】:SQL- How to get the most repeated text value per group during an aggregate operation? 【发布时间】:2019-07-21 23:20:36 【问题描述】:

我在这里解释一下。我有这两张桌子:

学生

Student_ID  HighSchool

ST_001      East High
ST_002      East High
ST_003      East High
ST_004      East High
ST_005      San Marino
ST_006      San Marino
ST_007      Tall Oaks
ST_008      Tall Oaks

医学测试

TestKit_ID  Student_ID   Class    Urine_results  Body_type

MedTest001  ST_001      English      0.8            I
MedTest002  ST_001      English      0.6            II
MedTest003  ST_003      English      0.8            II
MedTest004  ST_005      Math         0.6            IV
MedTest005  ST_005      Math         1.0            IV
MedTest006  ST_005      Math         1.4            III
MedTest007  ST_006      English      0.5            II
MedTest008  ST_006      English      0.6            III

我需要一个汇总表来指定所有班级,每个班级学生的医疗/身体结果的两个汇总列(AVG_urineRes 和 MOST_FREQ_BodyType),以及提供此类班级的学校。 请参阅下面的示例查询结果表:

HighSchool  Class     AVG_UrineRes  Body_type (most frequent per class)

East High   English       0.6           II
San Marino  Math          1.0           IV
San Marino  English       0.55          III

但是,如何获取最频繁的 body_type 聚合列?此时我的脚本如下所示:

Select s.highShool, m.class, AVG(m.urine_results), MOST_FREQ(m.body_type)
FROM Student s INNER JOIN MedicalTest m ON (s.Student_ID = m.Student_ID)
GROUP BY s.highShool, m.class

如果有像上面我的 sn-p 那样的 MOST_FREQ 函数,那就太好了!但没有。任何建议/解决方案将不胜感激。抱歉,表格结构可能看起来有点奇怪。我试图将一个真正的问题应用到这个例子中。

【问题讨论】:

关注greatest-n-per-group 以获得类似答案。非 html 表格也更容易阅读。 是什么让您决定为圣马力诺/英语选择 III 型? II 型也经常发生。此处是否适用某些规则,或者您是在任意选择一个值? 您使用的是哪个 mysql 版本? 索斯滕。是的,随意。我其实是在用access,不过我上周刚下载了MYSQL,所以最新版MySQL中的解决方案也可以。谢谢。 【参考方案1】:

您可以尝试如下查询。

 SELECT S.highschool, 
           MT.class, 
           Avg(urine_result), 
           (SELECT body_type 
            FROM   medical_tests M 
                   INNER JOIN students S1 
                           ON M.student_id = S1.student_id 
            WHERE  M.class = MT.class 
                   AND S1.highschool = S.highschool 
            GROUP  BY M.body_type 
            ORDER  BY Count(*)   desc
              LIMIT 1)MOST_FREQ 
    FROM   students S 
           INNER JOIN medical_tests MT 
                   ON MT.student_id = S.student_id 
    GROUP  BY S.highschool, 
              MT.class;

【讨论】:

以上是关于SQL-如何在聚合操作期间获取每组重复次数最多的文本值?的主要内容,如果未能解决你的问题,请参考以下文章

SQL:查询重复次数最多的名字和id

查找每组出现次数最多的条目

sql语句,求出现次数最多的组中,出现次数最多的一条数据

获取一列中重复次数最多的项目及其在另一列中的关联值[关闭]

powerbi显示出现次数最多的类别

使用 Hive 或 Pig 在字段中查找重复次数最多的值