dirmhirn
Goto Top

MySQL - suche eine Art user defined Group by

HI!

hab hier eine MySQL-Tabelle mit folendem Aufbau:

col1col2
A12
B12
B34
C11
C12
C23
D45
E67
E78

Muss jetzt alle Zeilen bei denen die erste Spalte gleich ist, zusammen bearbeiten.
zB alle Zeilen mit 'C': über die Zweite Spalte den Durchschnitt bilden und alle Zeilen die >10% davon entfernt sind - weiter verarbeiten.
nur ein Beispiel

arbeite mit PHP, mysqli und fetch_assoc()
ein Array mit allen "C"-Zeilen wäre super - so eine Art user defined Group by - gibt es das bei MySQL?

konkret geht es um kompatible und inkompatible Jahresintervalle, die ich je nachdem kombinieren muss. falls das relevant ist.

sg Dirm

Content-Key: 190241

Url: https://administrator.de/contentid/190241

Printed on: April 24, 2024 at 16:04 o'clock

Member: LianenSchwinger
LianenSchwinger Aug 27, 2012 at 11:49:03 (UTC)
Goto Top
Hallo Dirm,

das kannst Du doch mit einem SQL-Statment erledigen.

SELECT a.col1, a.col2
FROM tabelle a
INNER JOIN (SELECT b.col1, AVG(b.col2) col2
            FROM tabelle b 
            GROUP BY b.col1) c ON c.col1 = a.col1
WHERE a.col2 > 0.1 * c.col2

Gruß Jörg
Member: Dirmhirn
Dirmhirn Aug 27, 2012 updated at 12:28:30 (UTC)
Goto Top
Hi Jörg,

danke für die Antwort, aber das mit den 10% ist nur ein Beispiel.

Jede Zeile hat eine Jahresintervall: zB 1998-2012, oder 2003- - jeweils kompatible und inkompatible.
dann gibt es noch eine spalte mit einer bestimmten Konfiguration: xy, dc, sd

col1col2konfigyears
A12sd1999-2012
B12dc1999-2012
B34dc1999-2012
C11xy1998-2003
C12xy2004-2007
C23dc2008-2012
D45dc1999-2010
E67xy1998-2004
E78dc2001-2012

und dann gibt es noch inkompatible Jahre, die schneiden wieder "Löcher" in die "Ergebnisintervalle". Gibt es keine inkompatiblen und nur eine Konfig, dann werden alle Intervalle durch ein Offenes mit dem Startjahr ersetzt:

col1col2konfigyears
A12sd1999-
B12dc1999-
C11xy1998-2007
C23dc200face-cool|
D45dc1999-2010
E67xy1998-2004
E78dc2001-2012

so in etwa ein Beispiel ohne inkompatible. das Regelwerk ist leider ein bisschen kompliziert und noch nicht ganz ausgereift, d.h. wird sich im nächsten halben Jahr noch paar mal ändern. face-confused

werd jetzt die Zeilen einfach abfragen und in ein array schreiben - wenn ein neuer Wert in col1 kommt, dann verarbeite ich das Array und beginne von vorne mit den nächsten Daten.

hab mir gedacht, da gibts ev eine elegantere Lösung.

sg Dirm
Member: LianenSchwinger
LianenSchwinger Aug 27, 2012 at 12:42:47 (UTC)
Goto Top
... also nur so als Anmerkung würde ich die Spalte years in 2 Spalten splitten start_year und end_year.
Die Spalten könntest Du dann mit einem Update-Stament füllen.

Spielt der Wert in col2 keine Rolle beim Zusammenführen der Datensätze, oder wird da der kleinste oder der größe Wert genommen?

Ich denke das ganze kann man schon mit ein bisschen Überlegung per SQL-Update bzw. über den Umweg einer temporären Tabelle durchziehen. Die Frage ist natürlich wie groß die Tabelle ist und ob sich der Aufwand lohnt.

Gruß Jörg
Member: LianenSchwinger
LianenSchwinger Aug 27, 2012 updated at 13:01:00 (UTC)
Goto Top
... versuch mal folgendes

SELECT a.col1,
       MIN(a.col2) col2, -- oder was auch immer hier übernommen werden soll
       a.konfig,
       c.start_year||'-'||CASE WHEN c.end_year < EXTRACT(YEAR FROM SYSDATE) THEN c.end_year END years  
FROM tabelle a
INNER JOIN (SELECT b.col1,
                   b.konfig,
                   MIN(SUBSTR(years,1,4)) start_year
                   MAX(SUBSTR(years,6,4)) end_year
            FROM tabelle b
            GROUP BY b.col1, b.konfig) c ON a.col1 = c.col1 
                                         AND a.konfig = c.konfig
GROUP BY a.col1, a.konfig, 
         c.start_year || '-' || CASE WHEN c.end_year < EXTRACT(YEAR FROM SYSDATE) THEN c.end_year END   

Musst Du eventuell noch auf MySQL-Dialekt anpassen. Grundlage hier Oracle.

Gruß Jörg
Member: Dirmhirn
Dirmhirn Aug 28, 2012 at 11:32:19 (UTC)
Goto Top
Hi!

Spalte years in 2 Spalten splitten
anfangs war geplant, nur eine Zahl zu speichern.
Wir erfassen da Testdaten und der Erfassungsprozess ist leider erst im Wachstum und die DB wächst mit oder läuft nach - wie mans nimmt face-wink
ja ich weiß, dass es so nicht im Lehrbuch steht und äußerst mühsam ist... aber naja... was sollte man sonst den ganzen Tag machen...

Danke für die Tips!
aber ich werds mit PHP machen. einfach alle Zeilen zusammen sammeln und dann verarbeiten. gibt ja Lücken in den Jahreszahlen, Sonderfälle und viiiel mehr *gg*

sg Dirm