4

我正在使用Grails 标准(类似于休眠标准)从给定表中获取在每个部门中获得最高成绩的学生列表。我只想要Name,DivisionGrade字段。

Name | Division | Grade | Std_id
---------------------------------
AA1  | A        |  2     | 1
AA2  | A        |  4     | 2
BB1  | B        |  2     | 3
BB2  | B        |  5     | 4

我想要的结果是

Name | Division | Grade |
--------------------------
AA2  | A        |  4     |
BB2  | B        |  5     | 

如果我使用以下标准

    def criteria = Student.createCriteria()
    def resultlt = criteria.list {
        projections {
            groupProperty('divison')
            max('grade')             
        }
    }

我只有DivisionGrade,不包括其他字段。我也需要Name领域。

如果我将标准(在预测中一起使用聚合函数和属性)更改为

    def criteria = Student.createCriteria()
    def resultlt = criteria.list {
        projections {
            property('name')
            groupProperty('divison')
            max('grade')

        }
    }

它给出以下错误..

ERROR: column "this_.name" must appear in the GROUP BY clause or be
 used in an aggregate function
  Position: 63. Stacktrace follows:
org.postgresql.util.PSQLException: ERROR: column "this_.name" must
appear in the GROUP BY clause or be used in an aggregate function
  Position: 63
        at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryEx
ecutorImpl.java:2161)
        at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutor
Impl.java:1890)
        at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.ja
va:255)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Stat
ement.java:559)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(Abstract
Jdbc2Statement.java:417)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc
2Statement.java:302)
4

4 回答 4

5

这是一个常见的聚合问题。所选字段必须出现在 GROUP BY 子句 [*] 中。我可以看到您的 Division 列和 Name 列组合是无与伦比的,因此您需要以另一种方式进行。我认为您需要针对上述条件的子查询。

于 2016-09-16T11:32:47.327 回答
1

我认为使用 createCriteria 无法获得答案,但我尝试了其他方法,请尝试:

def studentList = Student.executeQuery("from Student A where A.Grade in (select max(B.Grade) from Student as B group by B.Division)")
于 2016-09-16T12:43:51.180 回答
1

您可以尝试以下查询。它运行顺利。

def studentDetails = Student.where {
grade == max(grade)}.property("name")).list().groupBy {"divison"}
于 2016-09-16T13:33:48.023 回答
0

为避免@Gokul 指出的问题,您可以尝试将您name放入一个max子句:

    def resultlt = Student.withCriteria() {
        projections {
            max 'name'
            groupProperty 'divison'
            max 'grade'                  
        }
    }

虽然我不确定在这里排序..

于 2016-09-16T12:11:00.620 回答