grails查询以获取一周中每天的平均值
我有一个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 要获取星期天的平均值,请首先获取星期天的日期。 然后使用条件查询查找平均值。请
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你是对的,伙计。只是做了一个快速的改变,应该会更好。