[英]Django self join , How to convert this query to ORM query
我如何将这个查询转换为Django ORM查询。
select T.node_id, ht, status, data from (
select id, Max(health_time) as ht, node_id from remote_sense_nodehealth group by node_id
) as T
join remote_sense_nodehealth on remote_sense_nodehealth.health_time=T.ht and remote_sense_nodehealth.node_id = T.node_id
实际上,我想基于其他列值获取所有最新值。
例如我的桌子就像-
c1 | c2 | c3
- - - - - - -
x | 1 AM | d1
x | 2 AM | d2
x | 3 AM | d3
y | 1 AM | d4
y | 2 AM | d5{
所需输出:
[{c1:x,c2:3AM,c3:d3},{c1:y,c2:2AM,c3:d5}]
使用更规范的数据模型,您将可以更轻松地进行此操作。 考虑使用这样的方法:
class NodeGroup(model.Model):
pass
class NodeHealth(model.Model):
node_group = models.ForeignKey(NodeGroup, related_name='nodes')
health_time = models.IntegerField()
status = models.IntegerField()
然后,您可以这样做:
from django.db.models import Max, F
nodes = NodeHealth.objects.all().annotate(
max_health_time=Max('node_group__nodes__health_time')
).filter(health_time=F('max_health_time'))
不幸的是,如果有多个节点具有相同的health_time
值,则返回的节点将具有重复health_time
。 您可能可以添加一个.distinct('node_group_id')
可以清除该问题,但我并非100%积极。
如果您的数据库支持分析,则可以执行以下操作:
q = NodeHealth.objects.extra(
select={'row_num': "ROW_NUMBER() OVER (PARTITION BY c1 ORDER BY c2 DESC)"},
where=["row_num=1"]
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.