nerodrom: MAX einer Spalte

Hallo,

ich hab wahrscheinlich ein sehr triviales Problem.
Ich suche die ID eines Maximums.

Kleines Beispiel
ID|Summe
01|12
02|18
03|12

(Diese Tabelle wird erst durch dir GroupBy-Funktion erstellt!)

Die Lösung soll also ID = 2 sein.

Mein derzeitiger Versuch schaut so aus. Funktioniert jedoch nicht!

SELECT Summe1.ID
FROM
(select r2.FK_id as ID, sum(r2.ranking) as Ranking
  from ranking r2
  group by r2.FK_id) Summe1,
(select r3.FK_id as ID, sum(r3.ranking) as Ranking
  from ranking r3
  group by r3.FK_id) Summe2
WHERE Max(Summe1.Ranking) = Max(Summe2.Ranking);

  1. yo,

    SELECT Summe1.ID
    FROM
    (select r2.FK_id as ID, sum(r2.ranking) as Ranking
      from ranking r2
      group by r2.FK_id) Summe1,
    (select r3.FK_id as ID, sum(r3.ranking) as Ranking
      from ranking r3
      group by r3.FK_id) Summe2
    WHERE Max(Summe1.Ranking) = Max(Summe2.Ranking);

    ersten wills du sicher nicht das kreuzprodukt beider tabellen (unterabfragen), sondern eher ein UNION ALL und selbst das scheint mir überflüssig zu sein.

    SELECT r1.id
    FROM raking r1
    WHERE (SELECT SUM(r2.raking) FROM raking r2 WHERE r1.id = r2.id)
           =
          (SELECT MAX(tab1.summen)
           FROM (SELECT sum(r3.ranking) as Summen FROM ranking r3 GROUP BY r3.FK_id
                ) tab1
          )

    Ilja

    1. SELECT r1.id
      FROM raking r1
      WHERE (SELECT SUM(r2.raking) FROM raking r2 WHERE r1.id = r2.id)
             =
            (SELECT MAX(tab1.summen)
             FROM (SELECT sum(r3.ranking) as Summen FROM ranking r3 GROUP BY r3.FK_id
                  ) tab1
            )

      Ilja

      Hallo Ilja,

      zunächst vielen, vielen Dank!!!
      Das Statement liefert gleich 4mal die Lösung?! Habs es erst einmal mit distinct unterbunden. Werde gleich mit dieser Lösung weiterarbeiten.

      Beste Grüße nerodrom

      1. yo,

        zunächst vielen, vielen Dank!!!

        gerne geschehen...

        Das Statement liefert gleich 4mal die Lösung?! Habs es erst einmal mit distinct unterbunden. Werde gleich mit dieser Lösung weiterarbeiten.

        jau, das DISTINCT fehlte, da du ja so oft Datensätze in der ergebnisliste erhälst, aus wieviel elementen sich die maximale summe zusammensetzt. das DISTINCT ist also notwending.

        Ilja

        1. jau, das DISTINCT fehlte, da du ja so oft Datensätze in der ergebnisliste erhälst, aus wieviel elementen sich die maximale summe zusammensetzt. das DISTINCT ist also notwending.

          Ilja

          Also für einen Anfänger doch nicht sooo trivial!! ;-)
          /nerodrom

          1. yo,

            jau, das DISTINCT fehlte, da du ja so oft Datensätze in der ergebnisliste erhälst, aus wieviel elementen sich die maximale summe zusammensetzt. das DISTINCT ist also notwending.

            Also für einen Anfänger doch nicht sooo trivial!! ;-)

            yepp scheint so, dass ich noch ein anfänger bin ;-)

            Ilja

  2. Die Anforderung:

    ich hab wahrscheinlich ein sehr triviales Problem.
    Ich suche die ID eines Maximums.

    Kleines Beispiel
    ID|Summe
    01|12
    02|18
    03|12

    (Diese Tabelle wird erst durch dir GroupBy-Funktion erstellt!)

    Die Lösung soll also ID = 2 sein.

    (Das Datenfeld 'ID' bezeichnet also hier überraschenderweise keine Identity, also keine Eindeutigkeit. Demzufolge missfällt uns entweder der Datenfeldname 'ID' und/oder das Datendesign.)
    (RDBMS ungenannt, Anforderungslage also möglicherweise dynamischer als erforderlich. => Bei Fragen Konzepte betreffend (hier der Fall) und bei Fragen, die Probleme betreffen, immer möglichst vollständige Angaben machen, werter Fragesteller!)

    Lösungsvorschläge:

    select top 1
     [id],
     count(*) as 'Summe'
    from
     DT_1
    group by
     [id]
    order by summe desc

    (Funktioniert mit T-SQL, also mit MS SQL Server.)

    select
     id,
     count(*) as 'Summe'
    from
     DT_1
    group by
     [id]
    order by summe desc
    limit
     0, 1

    (Funktioniert - soweit http://dev.mysql.com/doc/refman/5.1/de/select.html zu trauen ist - unter MySQL 5.1 (und vermutlich mit allen Versionen))

    Wenn die Daten nicht in DT_1 ("Datatable 1") liegen, sondern per Abfrage erst einmal zu ermitteln sind, bspw. aus einer DT_2 mit den Datensätzen:

    ID|ranking
    1|5
    2|3
    3|5
    1|5
    2|8
    3|1
    1|4

    So schlagen wir ein

    SELECT TOP 1
     [id],
     Summe
    FROM
     (
     select
      [id],
      sum(ranking) as 'Summe'
     from
      DT_2
     group by
      [id]
     ) DT_1
    GROUP BY
     [id],
     Summe
    ORDER BY
     Summe DESC

    vor; funktioniert mit MS SQL Server SQL, für MySQL die SELECT-Syntax wie oben beschrieben anpassen.

    Allerdings spricht unseres Erachtens nichts gegen:

    SELECT TOP 1
     [id],
     sum(ranking) as 'Summe'
    FROM
     DT_2
    GROUP BY
     [id]
    ORDER BY
     Summe desc

    All das alles unter der Annahme, dass versucht wird auf exakt einer Tabelle (Name: 'ranking', in den Beispielen oben als 'DT_1' bzw. 'DT_2' benannt) herumhühnernd Informationen zu gewinnen.

    1. yo,

      Allerdings spricht unseres Erachtens nichts gegen:

      meines erachtens spricht dagegen, dass top, bzw. limit klauseln immer mit vorsicht zu genießen sind, da sie gleiche werte (in diesem fall die summen) auschließen und das zu ungewollten ergebnissen führt. immer sicherer ist der weg über unterabfragen, in der der gesuchte wert (maximum) ermittelt wird und dann mit der entsprechenden tabelle abgeglichen wird. dann treffen auch alle gesuchten datensätze und nicht nur der erste.

      Ilja