grails查询以获取一周中每天的平均值

grails查询以获取一周中每天的平均值,grails,Grails,我有一个grails域类,看起来像这样: class Answer { String response Integer score Date created = new Date() } 如何进行查询以返回一周中每天的平均分数,像这样: average for Mondays = 25 average for Tuesdays = 20 .... average for sundays = 10 要获取星期天的平均值,请首先获取星期天的日期。 然后使用条件查询查找平均值。请

我有一个grails域类,看起来像这样:

class Answer {
String response
Integer score
Date created = new Date()
}         
如何进行查询以返回一周中每天的平均分数,像这样:

average for Mondays = 25
average for Tuesdays = 20
....
average for sundays = 10

要获取星期天的平均值,请首先获取星期天的日期。 然后使用条件查询查找平均值。请参见下面的示例:

dateOfSunday = ..
def c = Answer.createCriteria()
def avgScore = c.get {
  projections {
    avg "score"
  }
 lt("created",dateOfSunday.plus(1) )
 gt("created",dateOfSunday.minus(1) )
}
希望你有这个想法

编辑:

好的,如果您想要所有星期天的平均值,那么您可以在域类中使用公式,如:

class Answer {
 String response
 Integer score
 Date created = new Date()
 static mapping = {
    dayOfWeek formula: 'DAYOFWEEK(created)'
   }
}    
然后查询将是:

def c = Answer.createCriteria()
def avgScore = c.get {
  projections {
    avg "score"
  }
 eq("dayOfWeek ",7)
}
编辑:

@dmahapatro,谢谢你指出这一点

所有的平均分数也可以使用单个db hit获得。见下文:

def results = Answer.createCriteria().list() {
  projections {
    groupProperty('dayOfWeek')
    avg "score"
  }
} 

虽然它涉及的代码较少,但它有一个缺点,就是使用db函数,这会使查询速度变慢。您可以使用dmahapatro的建议。

获取周日的平均值,首先获取周日的日期。 然后使用条件查询查找平均值。请参见下面的示例:

dateOfSunday = ..
def c = Answer.createCriteria()
def avgScore = c.get {
  projections {
    avg "score"
  }
 lt("created",dateOfSunday.plus(1) )
 gt("created",dateOfSunday.minus(1) )
}
希望你有这个想法

编辑:

好的,如果您想要所有星期天的平均值,那么您可以在域类中使用公式,如:

class Answer {
 String response
 Integer score
 Date created = new Date()
 static mapping = {
    dayOfWeek formula: 'DAYOFWEEK(created)'
   }
}    
然后查询将是:

def c = Answer.createCriteria()
def avgScore = c.get {
  projections {
    avg "score"
  }
 eq("dayOfWeek ",7)
}
编辑:

@dmahapatro,谢谢你指出这一点

所有的平均分数也可以使用单个db hit获得。见下文:

def results = Answer.createCriteria().list() {
  projections {
    groupProperty('dayOfWeek')
    avg "score"
  }
} 

虽然它涉及的代码较少,但它有一个缺点,就是使用db函数,这会使查询速度变慢。你可以使用dmahapatro的建议。

我不确定我是否了解你的问题和你的域模型,但是这个草案可能会有所帮助

def summations = [
    'monday': [],
    'tuesday': [], 
    'wednesday': [],
    'thursday': [],
    'friday': [],
    'saturday': [],
    'sunday': []
]

def answers = Answer.list() 
answers.each {
    def dateCreated = it.created[Calendar.DAY_OF_WEEK]

    switch (dateCreated) {
        case Calendar.MONDAY:
            summations['monday'] << it.score     
            break
        case Calendar.TUESDAY:
            summations['tuesday'] << it.score
            break
        case Calendar.WEDNESDAY:
            summations['wednesday'] << it.score
            break
        case Calendar.THURSDAY:
            summations['thursday'] << it.score
            break
        case Calendar.FRIDAY:
            summations['friday'] << it.score   
            break
        case Calendar.SATURDAY:
            summations['saturday'] << it.score
            break
        case Calendar.SUNDAY:
            summations['sunday'] << it.score
            break
    } ​ 
}

// you can now do the average for every list in the map (sum of elements divided by number of item)

我不确定我是否了解你的问题和你的域模型,但也许这个草稿会有所帮助

def summations = [
    'monday': [],
    'tuesday': [], 
    'wednesday': [],
    'thursday': [],
    'friday': [],
    'saturday': [],
    'sunday': []
]

def answers = Answer.list() 
answers.each {
    def dateCreated = it.created[Calendar.DAY_OF_WEEK]

    switch (dateCreated) {
        case Calendar.MONDAY:
            summations['monday'] << it.score     
            break
        case Calendar.TUESDAY:
            summations['tuesday'] << it.score
            break
        case Calendar.WEDNESDAY:
            summations['wednesday'] << it.score
            break
        case Calendar.THURSDAY:
            summations['thursday'] << it.score
            break
        case Calendar.FRIDAY:
            summations['friday'] << it.score   
            break
        case Calendar.SATURDAY:
            summations['saturday'] << it.score
            break
        case Calendar.SUNDAY:
            summations['sunday'] << it.score
            break
    } ​ 
}

// you can now do the average for every list in the map (sum of elements divided by number of item)

这是对@lucke84答案的补充,是对他的方法的一个小修改(以防我对他的答案的编辑被遗漏)

def总和=[
“星期一”:[],
"星期二":[],,
“星期三”:[],
"星期四":[],,
“星期五”:[],
‘星期六’:[],
“星期日”:
]
def answers=Answer.list()
答案,每个{
def dateCreated=it.created[Calendar.DAY\u OF_WEEK]
开关(已创建日期){
案件日历.星期一:

summation.monday这是@lucke84答案的补充,是对他的方法的一个小修改(以防我对他的答案的编辑被遗漏)

def总和=[
“星期一”:[],
"星期二":[],,
“星期三”:[],
"星期四":[],,
“星期五”:[],
‘星期六’:[],
“星期日”:
]
def answers=Answer.list()
答案,每个{
def dateCreated=it.created[Calendar.DAY\u OF_WEEK]
开关(已创建日期){
案件日历.星期一:

summation.monday谢谢,但这只给出了一天的平均值,我想做的是得到数据库中所有桑拿日的平均值,但同样@Shaful,平均值会有7 db的调用。关键是要将调用次数减到最少。:)lucke84几乎做到了。我建议的一个小的修改可以使它工作到A一个db调用中所有工作日的平均值。谢谢,但这只给出了一天的平均值,我想做的是获得数据库中所有Saunday的平均值,但同样@Shaful,您将得到7个db调用的平均值。关键是要使db调用最小化。:)lucke84几乎做到了。我建议的一个小修改将在一次db调用中计算所有工作日的平均值。这是求和,朋友。你错过了平均值部分。@dmahapatro你是对的,伙计。只是做了一个快速的改变,应该会更好。那是求和,朋友。你错过了平均值部分。@dmahapatro你是对的,伙计。只是做了一个快速的改变,应该会更好。