dedlfix: MySQL: SUM der jeweils besten 3

Beitrag lesen

Tach!

Nun sollten in diese Summe aber jeweils nur die ersten 3 Einzelergebnisse einbezogen werden. Subselect? HAVING? Bin da nicht so firm…

Ich meine, das lässt sich gar nicht (so einfach) lösen. Bei Bedingungen wird jeder Datensatz einzeln betrachtet. Was davor war oder danach kommt, kann nicht berücksichtigt werden. Fällt dir ein Kriterium ein, wie du anhand des Datensatzes selbst entscheiden kannst, ob er genommen werden soll?

Gruppieren hilft da auch nicht, weil das aus mehreren Datensätzen nur einen einzelnen erzeugt. Having hift auch nicht, weil es nicht vor- und zurückschauen kann.

Man könnte über User-Defined Variables nachdenken, wenn dir dazu einfällt, was man von einem Datensatz speichern müsste, um beim nächsten feststellen zu können, ob er noch genommen werden soll oder nicht. Beachte dazu die Abarbeitungsreihenfolge von SQL-Statements. Die Klauseln werden von links nach rechts in Notationsreihenfolge ausgewertet mit Ausnahme der Feldliste nach dem SELECT, die zwischen GROUP BY und HAVING berechnet wird. Das heißt, im WHERE kann man sich noch nicht darauf beziehen, was erst in der SELECT-Klausel berechnet wird, im HAVING aber schon.

Eine weitere Idee ist, mit GROUP_CONCAT() die IDs der Datensätze einer Gruppe zu einem String zusammenzufassen, sie dann mit Stringverarbeitung auf drei Elemente zu kürzen und den Rest einem IN() zu übergeben. Wobei ich mir da gar nicht mal sicher bin, ob man dem IN() überhaupt den kommaseparierten String schackhaft machen kann. Falls ja, wäre das eine Lösung mit ein paar verschachtelten Subselects.

Und es bleibt immer noch eine Stored Procedure als Option, besonders dann, wenn viele Datensätze nicht genommen werden sollen, die sich nicht anderweitig rausfilten lassen. Wenn es nur 3 von 5 sind, dann kann man die zwei überflüssigen ruhig auch mit abfragen und im Script aussortieren. Die Technik dazu hört in beiden Fällen auf den Namen Gruppenwechsel: man iteriert über die Daten, merkt sich die Daten des vorhergehenden Datensatzes, stellt im Vergleich zum aktuellen fest, ob eine neue Gruppe beginnt, und zählt dann mit, dass nach drei Datensätzen der Rest ignoriert wird, bis eine neue Gruppe beginnt.

dedlfix.