繁体   English   中英

通过另一列的MAX值进行分组

[英]Group By with MAX value from another column

FieldStudies是:

ID          Name
---|-----------------------|
1  | Industrial Engineering| 
2  | Civil Engineering     |
3  | Architecture          |
4  | Chemistry             |

和表Eductionals是:

ID  UserID  Degree  FieldStudy_ID
---|------|--------|------------|
1  | 100  | 3      | 4          | 
2  | 101  | 2      | 2          |
3  | 101  | 3      | 2          |
4  | 101  | 4      | 3          |
5  | 103  | 3      | 4          |
6  | 103  | 4      | 2          |

我想找到每个FieldStudies的学生FieldStudies ,但要考虑到最高的Degree

所需的输出:

ID          Name              Count
---|-----------------------|--------|
1  | Industrial Engineering|   0    |
2  | Civil Engineering     |   0    |
3  | Architecture          |   1    |
4  | Chemistry             |   2    |

我努力了:

select Temptable2.* , count(*) As CountField from
    (select fs.*
    from FieldStudies fs
    left outer join
        (select e.UserID , Max(e.Degree) As ID_Degree , e.FieldStudy_ID
        from Eductionals e
        group by e.UserID) Temptable
    ON fs.ID = Temptable.FieldStudy_ID) Temptable2
group by Temptable2.ID

但是我收到以下错误:

在选择列表中,列“ Eductionals.FieldStudy_ID”无效,因为该列既未包含在聚合函数中,也未包含在GROUP BY子句中。

如果我理解正确,那么每个只需要最高的学位。 如果是这样,您可以使用row_number()缩减给定人员的多行,其余的是聚合和join

select fs.id, fs.Name, count(e.id)
from fieldstudies fs left join
     (select e.*,
             row_number() over (partition by userid order by degree desc) as seqnum
      from educationals e
     ) e
     on e.FieldStudy_ID = fs.id and seqnum = 1
group by fs.id, fs.Name
order by fs.id;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM