Как я могу получить максимальное значение каждого тега по дням в диапазоне дат с помощью django
Я создаю ListAPIView с помощью DRF.
Вот пример данных.
Колонка DateAndTime измеряется за 10 секунд, диапазон 6/30-8/31.
К сожалению, DateAndTime является CharField. Потому что дизайн базы данных такой.
Я нарезал поле dateandtime и получил столбец slicedate, используя annodate и Substr.
.
Я сделал это для того, чтобы сгруппировать по дням.
все работает нормально.
Я хочу получить максимальное значение каждого тега по дням в диапазоне дат.
Максимальное значение дублируется, поэтому я хочу получить самое быстрое среди них.
Я думаю, что мой запрос в порядке, но я получаю ошибку.
пожалуйста, помогите мне!
DateAndTime TagName DataValue
2022-06-30 14:15:40 BW004_GD-4-16 99
2022-06-30 14:15:50 BW004_GD-4-16 25
2022-06-30 14:16:00 BW004_GD-4-16 99
2022-06-30 14:16:10 BW004_GD-4-16 50
2022-06-30 14:16:20 BW004_GD-4-16 99
2022-06-30 14:16:30 BW004_GD-4-16 99
.
.
.
2022-06-30 14:15:40 BW004_GD-4-17 50
2022-06-30 14:15:50 BW004_GD-4-17 40
2022-06-30 14:16:00 BW004_GD-4-17 25
.
.
.
2022-06-30 18:20:00 BW004_GD-4-17 50
2022-06-30 18:20:10 BW004_GD-4-17 50
2022-06-30 18:20:20 BW004_GD-4-17 10
.
.
.
2022-06-30 14:15:40 BW004_GD-4-18 30
2022-06-30 14:15:50 BW004_GD-4-18 40
2022-06-30 14:16:00 BW004_GD-4-18 100
.
.
.
# models.py
class EnvAi(models.Model):
dateandtime = models.CharField(db_column='DateAndTime', blank=True, null=True) # Field name made lowercase.
tagname = models.CharField(db_column='TagName', max_length=50, blank=True, null=True) # Field name made lowercase.
datavalue = models.CharField(db_column='DataValue', max_length=50, blank=True, null=True) # Field name made lowercase.
class Meta:
managed = False
db_table = 'Env_AI'
# utils.py
def date_range(start=datetime.now().strftime("%Y-%m-%d"), end=datetime.now().strftime("%Y-%m-%d")):
start = datetime.strptime(start, "%Y-%m-%d")
end = datetime.strptime(end, "%Y-%m-%d")
dates = [(start + timedelta(days=i)).strftime("%Y-%m-%d") for i in range((end-start).days+1)]
return dates
# views.py
class EnvAiGasListAPI(ListAPIView):
## LOAD data range
dates = date_range('2022-06-30', '2022-07-10') #EX) ['2022-06-30', '2022-07-01', '2022-07-02', '2022-07-03']
queries = reduce(operator.or_, [Q(**{"dateandtime__startswith" : date}) for date in dates])
# HERE!!!!!
queryset = EnvAi.objects.values( 'datavalue', 'tagname').filter(queries)\
.annotate(slicedate=Substr('dateandtime', 1, 10)).values('tagname', 'slicedate').annotate(max_value=Max('datavalue'))
ERROR: column 'Env_AI.DateAndTime' must appear in the GROUP BY clause or be used in an aggregate function
Вот образец результата!
DateAndTime TagName DataValue
2022-06-30 14:15:40 BW004_GD-4-16 99
2022-06-30 14:15:40 BW004_GD-4-17 50
2022-06-30 14:16:00 BW004_GD-4-18 100
.
.
.