获取每个组SQL的第一行

问题描述 投票:1回答:2

我有如下数据。我想从以下数据中获得每种性别的首选

subjectID <- c("1", "2", "1", "0", "1", "0", "0", "1", "0", "2", 
       "0", "0", "2", "2","2","1","2","1","0","2")
gender <- c("M", "M", "F", "M", "M", "F", "M", "M", "M", "F", 
    "M", "F", "M", "M", "F","M", "F", "M", "F",  "F")

 selection <- data.frame(subjectID, gender)
       subjectID <- c("1", "2", "0")
       subject <- c("Maths", "Music",  "English")

    subjects <- data.frame(subjectID, subject)

我尝试按如下降序映射选项:

 favourite <- sqldf("SELECT  a.gender, b.subject, COUNT(a.subjectID) as `no of selections`
              FROM selection a
              JOIN subjects b
              ON (a.subjectID  = b.subjectID )
              GROUP BY a.subjectID, a.gender
              ORDER BY a.gender, `no of selections` DESC
              ")

但是,我想获得下表,其中我是每种性别的首选:

gender <- c("F", "M")
subjects <- c("Music", "Maths")
mostfav <- data.frame(gender, subjects)
mysql sql group-by greatest-n-per-group sqldf
2个回答
0
投票

如果我理解正确,则可以在SQL中使用窗口函数:

SELECT gs.*
FROM (SELECT s.gender, su.subject, COUNT(*) as cnt,
             ROW_NUMBER() OVER (PARTITION BY s.gender ORDER BY COUNT(*) DESC) as seqnum
      FROM selection s JOIN
           subjects su
           ON su.subjectID  = s.subjectID
      GROUP BY s.gender, su.subject
     ) gs
WHERE seqnum = 1;

0
投票

[如果您正在运行MySQL 8.0,则可以在子查询中使用RANK()对每个性别按主题计数对记录进行排名,并在外部查询中按组的顶部记录进行过滤(如果存在顶部关系,则[C0 ]保留它们):

RANK()

在较早的版本中,没有窗口功能,一种选择是使用SELECT gender, subject, no_of_selections FROM ( SELECT se.gender, su.subject, COUNT(*) as no_of_selections, RANK() OVER(PARTITION BY se.gender ORDER BY COUNT(*) DESC) rn FROM selection se JOIN subjects su ON se.subjectID = su.subjectID GROUP BY se.subjectID, se.gender, su.subject ) t WHERE rn = 1 ORDER BY gender DESC 子句进行过滤,该子句返回按性别返回的最高计数:

having

注意:

  • 我更改了表别名以使其更有意义

  • 您应该在SELECT se.gender, su.subject, COUNT(*) as no_of_selections FROM selection se JOIN subjects su ON se.subjectID = su.subjectID GROUP BY se.subjectID, se.gender, su.subject HAVING COUNT(*) = ( SELECT COUNT(*) FROM selection se1 WHERE se1.gender = se.gender GROUP BY se1.subjectID, se1.gender ORDER BY COUNT(*) DESC LIMIT 1 ) 子句中使用subject列,以使您的查询在sql模式GROUP BY下运行,该模式默认情况下从MySQL 5.7开始启用]]]

© www.soinside.com 2019 - 2024. All rights reserved.