4

Я использую Grails Criteria (аналогично критериям гибернации), чтобы получить список учеников, получивших высшую оценку в каждом подразделении из данной таблицы. И я хочу ТОЛЬКО Name, Division и Grade полей.Можно ли использовать агрегатные функции и свойства в проекциях, критериях, Grails?

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')    
     } 
    } 

я получил ТОЛЬКО Division и Grade, другие поля не включены. Мне также нужно поле 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

Это общая проблема агрегации. выбранные поля должны появиться в предложении GROUP BY [*]. Поскольку я вижу, что ваша колонка в столбце и колонке «Имя столбца» несравнимы, поэтому вам нужно сделать это по-другому. Я думаю, вам нужен подзапрос для вышеуказанного условия.

0

Чтобы избежать этой проблемы указал @Gokul вы можете попробовать положить вам name в max статье:

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

Хотя я не уверен, что сортировка здесь ..

+0

Это решение будет работать только тогда, когда столбец вы хотите выбрать имеет 'String' type.It не будет работать, если столбец имеет' числовой (междунар, длинный, флоат) 'типа. –

+0

Почему? если функция агрегата может быть применена, она будет работать с любым типом – injecteer

+0

. Я только что проверил ее, и он дает неправильные значения. Вы также можете проверить его. –

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)") 
+0

«отличительный» отсутствует во внешнем выборе – injecteer

+0

Вы хотите все детали, поэтому вам не нужно использовать разные. –

1

Вы можете дать попробовать ниже query.It работает плавно.

def studentDetails = Student.where { 
grade == max(grade)}.property("name")).list().groupBy {"divison"} 

 Смежные вопросы

  • Нет связанных вопросов^_^