簡體   English   中英

Postgres遞歸查詢+分組依據+加入Django

[英]Postgres Recursive query + group by + join in Django

我的要求是編寫一個SQL查詢,以獲取針對托管對象發生的子區域明智(故障)事件計數。 我的數據庫是postgres 8.4。 讓我解釋一下表結構。

我在Django中的表格:ManagedObject:

class Managedobject(models.Model):
   name                = models.CharField(max_length=200, unique=True)
   iscontainer         = models.BooleanField(default=False,)
   parentkey           = models.ForeignKey('self', null=True)

活動表:

class Event(models.Model):
    Name        = models.CharField(verbose_name=_('Name'))
    foid        = models.ForeignKey(Managedobject)

被管理對象記錄:

NOC
   Chennai
      MO_1
      MO_2
      MO_3
   Mumbai
      MO_4
      MO_5
      MO_6
   Delhi
   Bangalore
IP
   Calcutta
   Cochin

活動記錄:

event1 MO_1
event2 MO_2
event3 MO_3
event4 MO_5
event5 MO_6    

現在,我需要獲取所有子區域的事件計數。 例如,

for NOC region:
  Chennai - 3
  Mumbai - 2
  Delhi - 0
  Bangalore - 0

到目前為止,我能夠通過兩個不同的查詢獲得結果。

  1. 獲取子區域。

     select id from managedobject where iscontainer = True and parentkey = 3489 
  2. 對於每個區域(使用for循環),按如下方式獲取計數:

     SELECT count(*) from event ev WHERE ev.foid IN ( WITH RECURSIVE q AS ( SELECT h FROM managedobject h WHERE parentkey = 3489 UNION ALL SELECT hi FROM q JOIN managedobject hi ON hi.parentkey = (qh).id ) SELECT (qh).id FROM q ) 

請幫助組合查詢以使其成為單個查詢並獲取前5個區域。 由於在django中查詢很困難,因此我要進行原始sql查詢。

我得到了查詢:

WITH RECURSIVE q AS ( 
  SELECT  h, 
          1 AS level, 
          id AS ckey, 
          displayname as dname 
  FROM managedobject h 
  WHERE parentkey = 3489  
    and logicalnode=True 

 UNION ALL 

 SELECT  hi, 
         q.level + 1 AS level, 
         ckey, 
         dname 
 FROM q 
   JOIN managedobject hi ON hi.parentkey = (q.h).id 
) 
SELECT count(ckey) as ccount, 
       ckey, 
       dname 
FROM q 
  JOIN event as ev on ev.foid_id = (q.h).id 
GROUP BY ckey, dname 
ORDER BY ccount DESC 
LIMIT 5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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