SQL-funktion MAX ()

tplanitz

Erfahrenes Mitglied
Oracle 9.2.0.6 database = SQL-funktion MAX ()

Hallo,

folgendes ansich triviales Problem.

Eine Tabelle Mit 2 Spalten PhoneNumber, message_id

Beispieleintrag

PhoneNumber message_id
+123200227 550033354080155550000153
+123200227 93732647121155550109054
+123200227 645426790801155550000259
+33300333 430975525411155550000285
+33320333 620849202290155550000222

o.k.
Mit
Abfrage:
===========================
Code:
SELECT 
      Count (message_id) AS MessCnt
      , PhoneNumber
FROM
      Contact
GROUP BY
      PhoneNumber
===========================
Ergebnis:
===========================
PhoneNumber MessCnt
+123200227 3
+33320333 2
===========================
Aggregiere ich mir die Nachrichten zu einer Telefonnummer
Jetzt möchte ich die Telefonnummer rausfinden die MAX (MessCnt), also die höchste
Anzahl an Messages extrahieren. Ich dachte das geht so:
Abfrage:
===========================
SELECT
Max (MessCnt) MAX_MESS
, PhoneNumber
FROM
(
SELECT
Count (message_id)MessCnt
, PhoneNumber
FROM
Contact
GROUP BY
PhoneNumber
)
GROUP BY PhoneNumber
===============================

Aber leider bekomme ich die selbe Ausgabe wie vorher, es ist bestimmt einfach
aber ich kriege es nicht gebacken. Hat jemand nen Tip?
Probiere das mal als Code einzufügen
Code:
 [ SELECT
       Max (MessCnt) MAX_MESS
       , PhoneNumber
FROM
(
              SELECT 
                    Count (message_id)MessCnt
                    , PhoneNumber
              FROM
                    Contact
              GROUP BY
                  PhoneNumber
)
GROUP BY PhoneNumber
 
Zuletzt bearbeitet:
Das kannst Du einfacher aus Deiner ersten Abfrage machen, wenn ich Dein Anliegen richtig verstanden habe:
Code:
SELECT
  Count (message_id) AS MessCnt,
  PhoneNumber
FROM Contact
GROUP BY PhoneNumber
ORDER BY MessCnt DESC
LIMIT 1
Wenn es Dir um die Funktion MAX bezüglich der Gruppierung geht, bietet dieser Thread vielleicht nützliche Informationen.

Gruß hpvw

PS: Bezüglich Codeformatierung:
[ php ]code[ /php ] für PHP-Quelltexte,
[ html ]code[ /html ] für HTML-Quelltexte und
[ code ]code[ /code ] für sonstige Quelltexte, natürlich ohne die Leerzeichen.
Für kurze Code-Teile im Fließtext (z.B. Variablen- oder Funktionsnamen) kannst Du [ mono ]kurzer Code-Fetzen[ /mono ] verwenden.

EDIT: Mit dem letzten Hinweis war ich wohl zu spät.
 
Zuletzt bearbeitet:
Hi,

danke für die schnelle Antwort, dummerweise steht mir LIMIT unter ORACLE 9.2i nicht zu verfügung so weit ich weiß.
 
Hallo,

noch mal herzlichen Dank, das mit dem absteigenden sortieren war der Schlüssel und das Oracle eine nicht-sichtbare ROWNUM mitliefert !!

Hier die Lösung (nur ORACLE)

Code:
SELECT PhoneNumber, CntMess AS MAX
FROM
(         

                  SELECT 
                           PhoneNumber
                          , Count (message_id)    CntMess
                         
                  FROM
                          Contact
                  GROUP BY
                          PhoneNumber
                  ORDER BY 
                          CntMess Desc
                  
 )lala
 WHERE ROWNUM <=1

Es ist nur schade das sich die SQL bekannte MAX () funktion nicht darauf anwenden laesst oder ich halt noch zu gruen hinter den Ohren bin. Da das bilden der Temporären Tabelle ja KOSTEN verursacht wäre es super wennn jemand noch ne Idee hat.
Bis dann gute Nacht
 
tplanitz hat gesagt.:
Es ist nur schade das sich die SQL bekannte MAX () funktion nicht darauf anwenden laesst oder ich halt noch zu gruen hinter den Ohren bin. Da das bilden der Temporären Tabelle ja KOSTEN verursacht wäre es super wennn jemand noch ne Idee hat.
Bis dann gute Nacht
Das Problem ist, dass sowohl MAX als auch COUNT Gruppierungsfunktionen sind. Der SQL-Interpreter müsste erraten, dass sich MAX nicht mehr auf die Gruppe, sondern auf das gesamte Result bezieht. Vielleicht tut er das ja, dann könnte dies funktionieren:
Code:
SELECT 
  Count (c1.message_id) AS MessCnt, 
  c1.PhoneNumber
FROM Contact AS c1
GROUP BY c1.PhoneNumber
WHERE c1.MessCnt = (
  SELECT 
    MAX(Count(c2.message_id))
  FROM Contact AS c2
  GROUP BY c2.PhoneNumber
)
Gruß hpvw
 
Re: SQL-funktion MAX () vs. Aggregation b.z.w. Gruppieren von 2 Spalten

Hallo,

musste Deinen Vorschlag noch mal modifizieren da er mit der WHERE Clausel probleme hatte. Jetzt gehts tatsächlich ohne den Hack mit der ROWNUM:

Code:
SELECT 
        T_GET_ID.PhoneNumber ID, T_FIND_MAX.MAX_VAL
from

(
    SELECT
            Count (c1.message_id) AS MessCnt,
            c1.PhoneNumber  PhoneNumber
    FROM      
            Contact c1
    GROUP BY
            c1.PhoneNumber

) T_GET_ID
join
(
   SELECT
            Max (Count(message_id))  MAX_VAL
    FROM 
            Contact c2
    WHERE 
            PhoneNumber IS NOT null
    GROUP BY 
            c2.PhoneNumber
)  T_FIND_MAX

ON T_GET_ID.MessCnt = T_FIND_MAX.MAX_VAL

Ist jetzt zwar ein bisschen aufgebläht aber funktioniert jetzt mit MAX() !!

Also vielen Dank für die Denkanstöße
Habe noch das Thema umbenannt, findet sich dann besser im Web
 
Zuletzt bearbeitet:
Zurück