/ / Postgres Rekursive Abfrage + Gruppe von + Join in Django - Django, Postgresql, Rekursion, SQL

Postgres Rekursive Abfrage + Gruppe von + Join in Django - Django, Postgresql, Rekursion, SQL

Meine Anforderung besteht darin, eine SQL-Abfrage zu schreiben, um die für die verwalteten Objekte aufgetretene subregionale (Fehler-) Ereignisanzahl zu ermitteln. Meine Datenbank ist Postgres 8.4. Lassen Sie mich die Verwendung der Tabellenstruktur erklären.

Meine Tische im Django: Verwaltetes Objekt:

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

Ereignistabelle:

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

Verwaltete Objektsätze:

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

Ereignisse Aufzeichnungen:

event1 MO_1
event2 MO_2
event3 MO_3
event4 MO_5
event5 MO_6

Jetzt muss ich die Anzahl der Ereignisse für alle Unterregionen ermitteln. Beispielsweise,

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

Bis jetzt bin ich in der Lage, das Ergebnis in zwei verschiedenen Abfragen zu erhalten.

  1. Holen Sie sich die Subregionen.

    select id from managedobject where iscontainer = True and parentkey = 3489
    
  2. Ermitteln Sie die Anzahl für jede Region (mit for-Schleife) wie folgt:

    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 = (q.h).id
    )
    SELECT (q.h).id FROM q
    )
    

Bitte helfen Sie, die Abfragen zu kombinieren, um es zu einer einzigen Abfrage zu machen und die Top 5 Regionen zu bekommen. Da die Abfrage in Django schwierig ist, gehe ich für eine rohe SQL-Abfrage.

Antworten:

0 für die Antwort № 1

Ich habe die Frage:

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