簡體   English   中英

Django self join,如何將該查詢轉換為ORM查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM