Forum
Hallo 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ück
Weitere Vorschläge?
Ciao
Gernot