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

trbo2602

Benutzer
Beiträge
10
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 `ean` FROM `gebindedaten_april15` WHERE `ean` IS 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 `ean` FROM `gebindedaten_april15` WHERE `ean` IS 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
 
Werbung:
Werbung:
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.

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.
 
Zurück
Oben