Postgres Kreuztabellenabfrage mit $ libdir / tablefunc crosstab_hash Funktion

stimmen
0

Meine Kreuztabellenabfrage (siehe unten) läuft gut. Allerdings habe ich eine große Anzahl solcher Anfragen zu generieren, und - ganz entscheidend - die Zahl der Spaltendefinitionen werden von Tag zu Tag variieren. Wenn die Anzahl der Ausgangs columndefs nicht, dass der zweite Argument der Kreuztabellen- überein, wird die Kreuztabellen- werfen und Fehler und abbrechen. Daher kann ich nicht „hard-wire“ die Spaltendefinitionen wie in meiner aktuellen Abfrage, und ich brauche stattdessen eine Funktion, die, dass die Spaltendefinitionen wird dafür sorgen, wird on-the-fly synchronisiert werden. Ist es möglich, eine allgemeine Postgres Funktion zu schreiben, die in allen solchen Fällen wiederverwendbar sein? Hier ist meine Frage:

SELECT *
FROM crosstab
('SELECT 
to_char(ipstimestamp, ''mon DD HH24h'') As row_name, 
ips.objectid::text As category, 
COUNT(*)::integer As value
FROM loggingdb_ips_boolean As log 
INNER JOIN IpsObjects As ips 
ON log.Varid=ips.ObjectId
WHERE ((    log.varid = 37551) 
OR (log.varid = 27087)
OR (log.varid = 29469)   
OR (log.varid = 50876)
OR (log.varid = 45096)
OR (log.varid = 54708)
OR (log.varid = 47475)
OR (log.varid = 54606)
OR (log.varid = 25528)
OR (log.varid = 54729))
 GROUP BY to_char(ipstimestamp, ''yyyy MM DD HH24h''), row_name, objectid, category     
 ORDER BY to_char(ipstimestamp, ''yyyy MM DD HH24h''), row_name, objectid, category', 

 'SELECT DISTINCT varid 
 FROM loggingdb_ips_boolean ORDER BY 1;' 
 )

 As CountsPerHour(row_name text,  
 25528 integer,
 27087 integer,
 29469 integer,
 37551 integer,
 45096 integer,
 54606 integer,
 54708 integer,
 54729 integer)

PS: Beachten Sie, dass diese Abfrage kann unter dem folgenden Server gegen Testdaten ausgeführt werden: host: bellariastrasse.com Datenbank: IpsLogging Benutzer: guest Passwort: guest

Veröffentlicht am 19/06/2012 um 18:54
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
1

Ich habe Angst, was Sie wollen nicht vollständig möglich ist. Wenn der Rückgabetyp variiert, können Sie entweder

  • Erstellen Sie eine Funktion eine allgemeine Rückkehr SETOF record.

Aber dann würden Sie eine Spaltendefinitionsliste mit jedem Aufruf liefern müssen - bringen Sie direkt dorthin zurück, wo Sie begonnen haben.

  • eine neue Funktion mit einem passenden Rückgabetyp für jeden anderen Fall erstellen.

Aber das ist, was Sie versuchen zu vermeiden ...

Wenn Sie „eine große Anzahl solcher Abfragen“ schreiben haben könnten Sie eine verwenden Abfrage-Generator - Funktion statt, in der die Ergebnisse nicht zurückkommen würde , aber den DDL - Skript , das Sie in einem zweiten Schritt ausführen würden. Im Grunde eine Funktion , die .. in den variablen Teilen als Parameter und generiert den Query - String in Ihrem Beispiel nimmt RETURNS text.

Dies kann ziemlich komplex. Mehrere Meta-Ebene übereinander müssen in Betracht gezogen werden, aber es ist durchaus möglich. Achten Sie darauf , schwer Gebrauch machen Dollar-zitierte die zitierte Wahnsinn in Schach zu halten.

Beantwortet am 22/06/2012 um 02:32
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more