django orm:获取具有相应其他字段值的字段的最大值
我有这个表( counters ):
cell_id | tftralacc | tfnscan | thtralacc | thnscan datnscan | date_time |
---|---|---|---|---|---|
13997 | 10 | 360 | 94 | 360 | 2022-02-22 00:00:00:00+01 |
13997 | 01 13997 0 | 360 | 0 360 0 | 360 | 2022-22-22 01:00:00 00:00+01 |
13997 | 0 | 360 | 0 | 360 | 2022-02-22 02:00:00:00+01 |
13997 | 0 | 360 | 0 | 360 | 2022-02-22 03:00:00:00+ |
01 13997 | 360 | 360 360 | 83 | 360 | 2022-22-22-22-22-22-22-22-22 044 :00:00+01 |
13997 | 0 | 360 | 2 | 360 | 2022-02-22 05:00:00:00+01 |
15 | 360 | 15 | 360 | 06 | 00:00+01 |
13997 | 360 | 2022-02-22 | 13997 | 1 | : 07:00:00+01 |
13997 | 21 | 360 | 409 | 360 | 2022-02-22 08:00:00+01 |
13997 | 25 | 360 | 1282 360 1282 | 360 | 2022-02-22 09:00:00:00+01 |
13997 | 20 | 360 20 360 | 1201 | 360 | 2022-260 2022-2022-02-02-02-02-02-02-02-02-02-02-02-02-02-02-02-02-02-02-02-02-02-02-02-02-02-02-02-02-02-02-02-02-02-02-02-02-02-02-02-02-22-230 2022-2302 22 10:00:00+01 |
13997 | 30 | 360 | 1381 | 360 | 2022-02-22 11:00:00:00+01 |
13997 | 42 | 360 | 924 | 360 360 | 2022-02-22 12:00:00+01 |
14000 | 1 | 360 | 1 | 2022-22-22-22-22-22-22-22-22-22-22-22-22-22-22-22 | 360 360 360 360 -22 00:00:00+01 |
14000 | 0 | 360 | 0 | 360 | 2022-02-22 01:00:00:00+01 |
14000 | 1 | 360 | 0 | 360 | 2022-02-22 02:00:00:00+01 |
14000 | 0 | 360 | 2 360 2 | 360 | 2022- 02-22 03:00:00+01 |
14000 | 0 | 360 | 0 | 360 | 2022-02-22 04:00:00:00+01 |
14000 | 0 | 360 | 12 | 360 | 2022-02-22 05:00:00:00+ |
01 14000 | 3 | 360 4 360 | 4 | 360 4360 | 20222 -02-22 06:00:00+01 |
14000 | 24 | 360 | 123 | 360 | 2022-02-22 07:00:00:00+01 |
14000 | 31 31 | 360 | 374 | 360 | 2022-02-22 08:00:00+01 |
14000 | 18 | 360 620 | 360 | 620 360 360 360 360 360 360 | 2022-02-22 09:00:00+01 |
14000 | 38 | 360 | 1616 | 360 | 2022-02-22 10:00:00:00+01 |
14000 | 360 360 | 1410 | 1410 | 360 | 2022-02-22 11:00:00+01 |
14000 | 24 | 360 24 360 | 957 | 360 | 2022-02-22 12:00:00+01 |
我想获得最大流量的特定 date_time 值>对于每个 cell_id ,> tftralacc , tfnscan , thtralacc 和 thnscan )。
我已经通过使用 annotate()
和 group_by()
django QuerySet API:
result = Counters.objects.filter(
date_time__gte = date_start,
date_time__lte = date_end
).annotate(
# calculate the traffic for each row.
traffic = Case(
When(Q(tfnscan=0) or Q(thnscan=0), then=0),
default = Round((F('tftralacc')*1.0/F('tfnscan')) +
(F('thtralacc')*1.0/F('thnscan')), 2),
output_field=FloatField()
)
).order_by('cell_id').values(
# Group by cell_id.
'cell_id'
).order_by().annotate(
# calculate the max traffic for the grouped Cells.
max_traffic = Max('traffic')
)
我的代码成功返回了每个 cell_id 的最大流量:
cell_id | max_traffic |
---|---|
13997 | 3.92 |
14000 | 4.59, |
但我的目标是获得相应的 date_time 值每个最大值。这样:
Cell_ID | MAX_TRAFFIC | DATE_TIME |
---|---|---|
13997 | 3.92 | 2022-02-22 11:00:00:00+01 |
14000 | 4.59 | 2022-02-22 10:00:00+01 |
或
Cell_ID | Date_time_time_time |
---|---|
13997 | 2022-22-22-22 11:00+01:00+01:00+01:00+01:00+01:00 |
14000 | 2022-02-22 10:00:00+01, |
因为该最大值只是获得 date_time 而不是目标的均值。
注意:有一个问题描述了我的问题,但是它的答案是指工作解决方案,而我的问题是不可能的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
使用
with 加入
models.subquery
cell_id
字段。然后使用querySet.annotate()
用max_traffic
注释子查询。最后,使用querySet.filter()
选择具有流量
等于max_traffic
的行,并使用.distinct()
删除重复行。Use
models.Subquery
withmodels.OuterRef
to join oncell_id
field. Then usequeryset.annotate()
to annotate the subquery withmax_traffic
. Finally, usequeryset.filter()
to select rows that havetraffic
equals tomax_traffic
and use.distinct()
to remove duplicate rows.