Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

DISTINCT Abfrage bis zu best. Wert, dann von Vorne beginnen

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von trbo2602, 12 Juni 2015.

  1. trbo2602

    trbo2602 Benutzer

    Liebe Sql Freunde,

    ich stehe vor folgendem Problem bzgl. einer Abfrage aus meiner Datenbank. Hier mal ein kurzert Auszug.

    screenshot DB.PNG

    Nun möchte ich es schaffen über eine SELECT DISTICT Abfrage die doppelten Werte im Feld ean zu entfernen, sprich das jede ean nur einmal auftauch zwischen den Zeilen in denen im Feld smr_bon der Wert bon steht. Die Zeilen mit Bon müssen hierbei auch mit ausgegeben werden.

    mit diesem Ausschnitt will ich quasi also folgendes machen:

    screenshot DB2.png

    Bisher schaffe ich es nur für den Gesamten Datensatz mir die doppelten werte löschen zu lassen bzw. für einzelne Tage. Die klappt mit folgendem Code:

    PHP:
    SELECT DISTINCT `eanFROM `gebindedaten_april15WHERE `eanIS NOT NULL AND `datum` ='01.04.2015'
    Ich dachte über die Lösung mit einer Schleife nach, welche SELECT DISTINCT so lange anwendet bis im 'bon' gefunden wird und dann von vorne anfängt, die zeile mit 'bon' dabei aber nicht entfernt.

    Dachte da an einen Code der in etwa so aussieht, wobei ich in mysql noch nicht mir Schleifen gearbeitet habe ...
    PHP:
    WHILE `smr_bon` != 'bon'
        
    SELECT DISTINCT `eanFROM `gebindedaten_april15WHERE `eanIS NOT NULL
       
        
    FOR `smr_bon` = 'bon'
            
    SELECT `ean`    FROM `gebindedaten_april15`
    Als Ausgabe erhoffe ich mir eine Liste die lediglich aus der Spalte ean besteht, wobei auf die verschiedenen (gefilterten) ean's eine Leere zeile folgt....

    Hoffe jemand kann mir helfen

    lg

    trbo
     
  2. Chuky666

    Chuky666 Datenbank-Guru

    Hi,

    vielleicht könnte eine GROUP BY helfen?!

    Grüße
     
  3. akretschmer

    akretschmer Datenbank-Guru

    Das geht über Window-Funktionen. Du zählst je Partition (hier: gleiche EAN und Bonnummer undsortiert nach Uhrzeit desc/asc) das Vorkommen und nimmst nur die jeweils ersten.

    Ich bin jetzt zu faul, die Daten aus dem Bild da abzumalen, sinngemäß unduntested so:

    Code:
    select * from (select *, row_number() over (partition by ean, bunnummer order by uhrzeit desc) where row_number = 1;
    
    Soweit so gut und einfach. MySQL kann nur solche analytischen Funktionen derzeit nicht, Du müßtest entweder nach einer Alternative for row_number() unter MySQL suchen oder gleich eine richtige DB nehmen.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden