DISTINCT

black_79

Benutzer
Beiträge
16
Hallo,
wie kann ich doppelte Einträge ausblenden, wenn zwei Werte gleich sind?
Wenn der Wert "Kennung" doppelt ist + der Wert "Uhrzeit" doppelt ist als Bedingung.

DISTINCT wert1 and wert2

SELECT * FROM monitord_pocsag
JOIN monitord_bezeichnung
WHERE LEFT (monitord_pocsag.kennung, 7) = LEFT(monitord_bezeichnung.kennung, 7)
DISTINCT (monitord_pocsag.uhrzeit) AND (monitord_pocsag.kennung)
ORDER BY monitord_pocsag.id
 
Werbung:
Hallo,
wie kann ich doppelte Einträge ausblenden, wenn zwei Werte gleich sind?
Wenn der Wert "Kennung" doppelt ist + der Wert "Uhrzeit" doppelt ist als Bedingung.

DISTINCT wert1 and wert2

SELECT * FROM monitord_pocsag
JOIN monitord_bezeichnung
WHERE LEFT (monitord_pocsag.kennung, 7) = LEFT(monitord_bezeichnung.kennung, 7)
DISTINCT (monitord_pocsag.uhrzeit) AND (monitord_pocsag.kennung)
ORDER BY monitord_pocsag.
oder anders noch:

wenn der Wert "Kennung" doppelt ist in einem bestimmten Zeitfenster ( 2 Minuten) dann diesen Wert nicht anzeigen.
 
Distinct gehört nicht in die Bedingung, sondern in die Select Clause.
Es bezieht sich erstmal auf alle Felder, die in der Menge vorliegen, nicht auf benannte Felder.

Ein normaler Join muss also vorher mit Distinct bearbeitet werden. Erst Distincte Menge bilden, dann joinen.
Dies funktioniert straight forward nur, wenn alle benötigten Felder (Weiterverarbeitung der Daten) ausschließlich aus den Feldern bestehen, die Distinct sein sollen.
Ist das nicht der Fall, muss man erst Distincten, das Ergebnis auf alle benötigen Felder zurück transformieren und das dann weiter verwenden.

Da Dein SQL Statement falsch ist und ich die Frage so nicht ganz genau verstehe und auch keine Beispieldaten vorliegen, kann ich da erstmal nicht mehr zu sagen.
 
Distinct gehört nicht in die Bedingung, sondern in die Select Clause.
Es bezieht sich erstmal auf alle Felder, die in der Menge vorliegen, nicht auf benannte Felder.

Ein normaler Join muss also vorher mit Distinct bearbeitet werden. Erst Distincte Menge bilden, dann joinen.
Dies funktioniert straight forward nur, wenn alle benötigten Felder (Weiterverarbeitung der Daten) ausschließlich aus den Feldern bestehen, die Distinct sein sollen.
Ist das nicht der Fall, muss man erst Distincten, das Ergebnis auf alle benötigen Felder zurück transformieren und das dann weiter verwenden.

Da Dein SQL Statement falsch ist und ich die Frage so nicht ganz genau verstehe und auch keine Beispieldaten vorliegen, kann ich da erstmal nicht mehr zu sagen.
ich suche eine Lösung, um doppelte Datensätze in einem bestimmten Zeitfenster auszublenden.

beispiel bild:

die ersten beiden Datensätze haben die gleiche "kennung" aber eine unterschiedliche "uhrzeit"
ich möchte gerne alle doppelten Datensätze mit gleicher "kennung" + eine datetime differenz "<90sec" ausblenden

in meinem beispiel, beträgt die differenz zwischen Datensatz 1 und 2 ca. "22sec" hier müsste jetzt der zweite datensatz ausgeblendet werden
 

Anhänge

  • SQL_Bild_1.PNG
    SQL_Bild_1.PNG
    8,6 KB · Aufrufe: 2
mal vereinfacht suchst Du wohl sowas wie hier, vereinfacht:

Code:
postgres=# select * from black79 ;
 zeit | kennung 
------+---------
   10 |       1
   12 |       1
   13 |       2
   15 |       3
(4 rows)

postgres=# select distinct on(kennung) * from black79 order by kennung, zeit asc;
 zeit | kennung 
------+---------
   10 |       1
   13 |       2
   15 |       3
(3 rows)

postgres=# select distinct on(kennung) * from black79 order by kennung, zeit desc;
 zeit | kennung 
------+---------
   12 |       1
   13 |       2
   15 |       3
(3 rows)

postgres=#
 
gut, DISTINCT ON() ist eine PostgreSQL-spezifische Erweiterung, das wird Dein MySQL nicht können. In dem Falle hilft aber GROUP BY in Verbindung mit einer Aggregation wie min() oder max().
 
mal vereinfacht suchst Du wohl sowas wie hier, vereinfacht:

Code:
postgres=# select * from black79 ;
 zeit | kennung
------+---------
   10 |       1
   12 |       1
   13 |       2
   15 |       3
(4 rows)

postgres=# select distinct on(kennung) * from black79 order by kennung, zeit asc;
 zeit | kennung
------+---------
   10 |       1
   13 |       2
   15 |       3
(3 rows)

postgres=# select distinct on(kennung) * from black79 order by kennung, zeit desc;
 zeit | kennung
------+---------
   12 |       1
   13 |       2
   15 |       3
(3 rows)

postgres=#

ja, es geht in die richtige richtung! grob
es fehlt halt noch die abgrenzung zeit differenz !
die kennung darf sonst noch weitere male auftauchen, aber nicht in dieser kurzen zeit (90 Sekunden)
 
gut, DISTINCT ON() ist eine PostgreSQL-spezifische Erweiterung, das wird Dein MySQL nicht können. In dem Falle hilft aber GROUP BY in Verbindung mit einer Aggregation wie min() oder max().
SQL_Bild_1.PNG

hier habe ich noch einen gedankenfehler,
über HAVING (filter) größer als 25sec datensatz anzeigen ? eigentlich müsste jetzt doch der datensatz 2 angezeigt werden oder nicht?
 
hier habe ich noch einen gedankenfehler,
Ja.

Du berechnest ja keine Differenzen zwischen Datensätzen, sondern min() gruppiert nach Kennung. Dazu kommt ein Bug in MySQL: alle Spalten im Resultat müssen entwder aggregiert oder gruppiert sein. Dies ist nicht der Fall. Anstatt eines (korrekten) Fehlers liefert MySQL nun ein zufälliges Resultat. Und nein min(uhrzeit)>25 macht auch keinen Sinn...
 
Ja.

Du berechnest ja keine Differenzen zwischen Datensätzen, sondern min() gruppiert nach Kennung. Dazu kommt ein Bug in MySQL: alle Spalten im Resultat müssen entwder aggregiert oder gruppiert sein. Dies ist nicht der Fall. Anstatt eines (korrekten) Fehlers liefert MySQL nun ein zufälliges Resultat. Und nein min(uhrzeit)>25 macht auch keinen Sinn...
ja habe irgendwie gerade eine blockade

hab noch keine idee wie ich es umsetzen soll :-(
 
Werbung:
Zurück
Oben