Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

MySQL - suche eine Art user defined Group by

Frage Entwicklung Datenbanken

Mitglied: Dirmhirn

Dirmhirn (Level 2) - Jetzt verbinden

27.08.2012 um 13:34 Uhr, 2479 Aufrufe, 5 Kommentare

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
Mitglied: LianenSchwinger
27.08.2012 um 13:49 Uhr
Hallo Dirm,

das kannst Du doch mit einem SQL-Statment erledigen.

01.
SELECT a.col1, a.col2 
02.
FROM tabelle a 
03.
INNER JOIN (SELECT b.col1, AVG(b.col2) col2 
04.
            FROM tabelle b  
05.
            GROUP BY b.col1) c ON c.col1 = a.col1 
06.
WHERE a.col2 > 0.1 * c.col2
Gruß Jörg
Bitte warten ..
Mitglied: Dirmhirn
27.08.2012, aktualisiert um 14:28 Uhr
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
C23dc200|
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.

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
Bitte warten ..
Mitglied: LianenSchwinger
27.08.2012 um 14:42 Uhr
... 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
Bitte warten ..
Mitglied: LianenSchwinger
27.08.2012, aktualisiert um 15:01 Uhr
... versuch mal folgendes

01.
SELECT a.col1, 
02.
       MIN(a.col2) col2, -- oder was auch immer hier übernommen werden soll 
03.
       a.konfig, 
04.
       c.start_year||'-'||CASE WHEN c.end_year < EXTRACT(YEAR FROM SYSDATE) THEN c.end_year END years 
05.
FROM tabelle a 
06.
INNER JOIN (SELECT b.col1, 
07.
                   b.konfig, 
08.
                   MIN(SUBSTR(years,1,4)) start_year 
09.
                   MAX(SUBSTR(years,6,4)) end_year 
10.
            FROM tabelle b 
11.
            GROUP BY b.col1, b.konfig) c ON a.col1 = c.col1  
12.
                                         AND a.konfig = c.konfig 
13.
GROUP BY a.col1, a.konfig,  
14.
         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
Bitte warten ..
Mitglied: Dirmhirn
28.08.2012 um 13:32 Uhr
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
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
Bitte warten ..
Neuester Wissensbeitrag
Festplatten, SSD, Raid

12TB written pro SSD in 2 Jahren mit RAID5 auf Hyper-VServer

Erfahrungsbericht von Lochkartenstanzer zum Thema Festplatten, SSD, Raid ...

Ähnliche Inhalte
Datenbanken
gelöst SSIS - Group By und MAX von String-Spalten (2)

Frage von batpoint zum Thema Datenbanken ...

Datenbanken
gelöst Eine Art Access, nur mit PHP und MySQL? (14)

Frage von McLion zum Thema Datenbanken ...

Microsoft
High CPU use by taskhost.exe when Windows 8.1 user name contains "user" (12)

Link von Lochkartenstanzer zum Thema Microsoft ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (34)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...