Eigene Aggregat-Funktion definieren (z.B. wie sum)
- Dieses Thema hat 6 Antworten und 1 Teilnehmer, und wurde zuletzt aktualisiert vor 17 Jahre, 11 Monaten von
Anonym.
-
AuthorPosts
-
14. Oktober 2005 um 10:17 Uhr #2618
AnonymGastHallo,
ich möchte aus einer belibiegen Anzahl von Zahlen die Zahl ermitteln, die am häufigsten vorkommt.
Also als Beispiel aus einer Spalte mit deren Werten (1,4,4,6,7) möchte ich die 4 als Ergebnis erhalten.Daher dachte ich mir, das ich eine eigene Aggregatfunktion schreiben sollte.
Wie kann ich so eine Funktion schreiben bzw. ist es überhaupt möglich eine eigene Aggregatfunktion zu schreiben?Vielen Dank
14. Oktober 2005 um 13:10 Uhr #3047
AnonymInaktivHallo Vulpo,
was spricht gegen einen klassischen sql command, wie z. B.:
select tabellenfeld, count(*) from tname group by tabellenfeld order by 2 desc
Die erste row beinhaltet dann das Ergebnis; alternativ kommt man auch noch mittels eines weiteren übergestülpten SELECT zu einem single row result.
Gruß
Bunbury
14. Oktober 2005 um 13:28 Uhr #3348
AnonymGastDa es sich bereits um ein sehr großes sql handelt, wollte ich diese Funktionalität gerne in eine Funktion verlagern.
Die Idee mit dem Suchen und Zählen finde ich gut. Danke dafür.Im Prinzip möchte ich trotzallem eine eigene Funktion gerne haben, da das sql wie gesagt bereits sehr umfangreich ist.
17. Oktober 2005 um 12:25 Uhr #3535
AnonymInaktivBunbury wrote: alternativ kommt man auch noch mittels eines weiteren übergestülpten SELECT zu einem single row result.
einen SELECT wirst Du nicht drüberstülpen können, wenn Du innen drinnen einen ORDER BY verwendest …
17. Oktober 2005 um 13:11 Uhr #3665
AnonymInaktivHallo,
der "order by" würde dann auch überflüssig werden. Leider unterstützt meine DB2-Version solch‘ tolle Sachen auch nicht, so dass ich leider nicht mit einem funktionstüchtigen SQL-command aufwarten kann. Und ein SQL-command als Trockenübung kann leicht sehr schief gehen!
Aber vielleicht kann der Uli da etwas tolles – wie schon so oft – zaubern?
Gruß
Bunbury
17. Oktober 2005 um 14:02 Uhr #3760
AnonymInaktivNee, im dezentralen Umfeld kenne ich mich nicht so aus.
Unter z/OS könnte bei Version 8 das funktionieren:select tabellenfeld, count(*)
into …..
from tabname
group by tabellenfeld
order by 2 desc Â
fetch first 1 rows only ;aber ausprobieren kann ich’s nicht, weil ich (noch) kein V8-System habe
Ausserdems gibts dabei natürlich immer ein Problem, wenn zwei Werte gleich oft vorkommen.
Gruss
Uli
20. Oktober 2005 um 7:29 Uhr #3822
AnonymInaktivHallo zusammen,
ich hab‘ mal ein paar Lösungen zu diesem Thema zusammengestellt, die teilweise auf einfachstes SQL setzen, aber auch neue SQL-Funktionen nutzen.
Hinweis: Die Tabelle, die die vorgegebenen Werte (z.B. 1,2,4,4,7) enthält, heißt T2. Alle Ausprägungen von T2.C1 werden in der generierten Spalte T2.C2 oder T2.C3 dargestellt.
Möglich mit DB2 UDB L/U/W oder DB2 for Z/OS V8
with inline_view as (select c1, count(*) as c2
from t2
group by c1)
select c1, c2
from inline_view
where c2 = (select max(c2) from inline_view)
;Mit allen DB2’s möglich:
select c1, c2
from (select c1,count(*) as c2
from t2
group by c1) as inline_view
where c2 = ( select max(c2)
from (select c1,count(*) as c2
from t2
group by c1) as inline_view
)
;Funktioniert mit DB2 UDB L/U/W, evtl. auch DB2 for Z/OS V8
SELECT c1, (rank() over (ORDER BY c2 DESC)) AS c3
FROM ( SELECT c1, COUNT(*) AS c2
FROM t2
GROUP BY c1 ) AS X1
FETCH first 1 ROW ONLY;Nun eine Funktion, wie ursprünglich gewünscht:
CREATE FUNCTION MOST_T2 ()
RETURNS INTEGER
SPECIFIC MOST_T2
LANGUAGE SQL
READS SQL DATA
NO EXTERNAL ACTION
DETERMINISTIC
RETURN
select c1
from ( select c1, count (*) as c2
from t2
group by c1) as inline_view
where c2 = ( select max (c2)
from ( select c1, count (*) as c2
from t2
group by c1) as inline_view
)
;select distinct c1
from t2
where c1 = most_t2()     — liefert 4 zurückWeitere Vorschläge?
Ciao
Gernot
-
AuthorPosts
You must be logged in to reply to this topic.