DISTINCT, Sortierreihenfolge

DISTINCT, Sortierreihenfolge

am 02.03.2006 12:34:31 von michele

Hallo erstmal an die Gruppe...! :)

Meine Frage: ich habe eine Tabelle mit den Spalten
"ProdukteIx", "Title" und "WDate"

und dem folgenden Inhalt:
1127;"Produktname1 Größe 1";"2006-02-23"
1127;"Produktname1 Größe 2";"2006-02-24"
1127;"Produktname1 Größe 3";"2006-03-25"
1127;"Produktname1 Größe 2";"2006-03-29"
1128;"Produktname2 Größe 1";"2006-03-23"
1128;"Produktname2 Größe 2";"2006-03-25"
1128;"Produktname2 Größe 1";"2006-03-29"
1129;"Produktname3 Größe 1";"2006-03-28"

Wie man sieht, habe ich bereits nach ProdukteIx und WDate
(Wareneingangsdatum) sortiert. Für mich ist interessant, wann ein
Produkt mit einer bestimmten Produktnummer das erste mal am Lager
ankam, also ich kann die Größe ignorieren.

Meine Abfrage wäre (verkürzt da Beispiel!)

SELECT DISTINCT ProdukteIx, WDate
FROM Produkte
ORDER BY ProdukteIx, WDate;

...und meine Frage an euch:
Nach welchem Kriterium sortiert DISTINCT? Kann ich mir sicher sein,
immer das erste Wareneingangsdatum zu finden, oder nimmt er das letzte
oder eins aus der Mitte?

Vielen Dank für eure Antworten :)

Michele

Re: DISTINCT, Sortierreihenfolge

am 02.03.2006 12:46:12 von Christian Winther

Michele schrieb:
[...]
>
> Meine Abfrage wäre (verkürzt da Beispiel!)
>
> SELECT DISTINCT ProdukteIx, WDate
> FROM Produkte
> ORDER BY ProdukteIx, WDate;
>
> ....und meine Frage an euch:
> Nach welchem Kriterium sortiert DISTINCT? Kann ich mir sicher sein,
> immer das erste Wareneingangsdatum zu finden, oder nimmt er das letzte
> oder eins aus der Mitte?

DISTINCT bedeutet, bei mehreren gleichen Ergebnissen nur ein Ergebnis
auszugeben.

Du suchst:

SELECT ProdukteIx, MIN(WDate)
FROM Produkte
GROUP BY ProdukteIx;

HTH CW

Re: DISTINCT, Sortierreihenfolge

am 02.03.2006 12:46:49 von Michele Marsching

Kurze Anmerkung:

Für ein GROUP BY bleibt die Frage bestehen: Datensätze a,b,c ... auf
welchen davon wird gegroupt?

Datensatz a, weil immer der erste?
Datensatz c, weil immer der letzte?
Oder Datensatz b, weil irgendeiner aus der Mitte?
Oder per Zufall? Welche Regeln gelten hier?

Re: DISTINCT, Sortierreihenfolge

am 02.03.2006 13:15:12 von Sibylle Koczian

Michele Marsching schrieb:
> Kurze Anmerkung:
>=20
> Für ein GROUP BY bleibt die Frage bestehen: Datensätze a,b,c ... au=
f
> welchen davon wird gegroupt?
>=20
> Datensatz a, weil immer der erste?
> Datensatz c, weil immer der letzte?
> Oder Datensatz b, weil irgendeiner aus der Mitte?
> Oder per Zufall? Welche Regeln gelten hier?
>=20

Wenn das einen Unterschied macht, ist die Abfrage nicht richtig.
Standardkonformes SQL will in der Felderliste bei GROUP BY nur sehen:
die Felder, nach denen gruppiert wird und dazu Aggregatfunktionen über
andere Felder. Felder, die sich innerhalb der Gruppe unterscheiden,
haben in einer GROUP BY-Abfrage nichts zu suchen.

--=20
Dr. Sibylle Koczian
Universitaetsbibliothek, Abt. Naturwiss.
D-86135 Augsburg
e-mail : Sibylle.Koczian@Bibliothek.Uni-Augsburg.DE

Re: DISTINCT, Sortierreihenfolge

am 02.03.2006 13:58:35 von Michele Marsching

Danke für den Rat... aber was wenn doch? Ich repariere hier an einem
Tool rum, das genau solche Queries hat... wonach würde er sortieren
bei

SELECT ProdukteIx, WDate
FROM Produkte
GROUP BY ProdukteIx;

mySQL kann es eben... was was geht wurde von meinem Vorgänger
gemacht... :/

Re: DISTINCT, Sortierreihenfolge

am 02.03.2006 15:05:52 von Thomas Rachel

Michele Marsching wrote:

> Danke für den Rat... aber was wenn doch? Ich repariere hier an einem
> Tool rum, das genau solche Queries hat... wonach würde er sortieren
> bei
>
> SELECT ProdukteIx, WDate
> FROM Produkte
> GROUP BY ProdukteIx;

Das ist nicht spezifiziert - vermutlich das erste, was er in der Tabelle
findet (möglicherweise auch das letzte?)

Wenn Du es definiert brauchst (in der Nachricht
<1141299271.446678.129280@j33g2000cwa.googlegroups.com> schriebst Du: "Für
mich ist interessant, wann ein Produkt mit einer bestimmten Produktnummer
das erste mal am Lager ankam") mußt Du oben WDate durch min(WDate)
ersetzen.

Nebenbei ist die Datenbank nicht richtig normalisiert; das könnte Dir evtl.
bei manchenAbfragen noch zu schaffen machen. Wenn ProdukteIx genau mit
einem Produktnamen korreliert, solltest Du in Erwägung ziehen, das Feld
"Title" zu ersetzen durch ein Feld "Groesse" oder "size" oder so und dort
nur die Größeninformation reinschreiben. Den Produktnamen bringst Du dann
in einer separaten Tabelle unter.

http://de.wikipedia.org/wiki/Normalisierung_(Datenbank)
http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/chap4.htm

Wenn Du in obigem Abschnitt "ersetzen" durch "ergänzen" ersetzt und volle
Kontrolle über alle auf die Datenbank zugreifenden Programme und Skripte
hast und Du genau weißt, was Du tust, kannst Du das durchaus auch im
laufenden Betrieb machen; das alte Feld "Title" wirfst Du erst dann weg,
wenn Du absolut sicher bist, daß das, was Du geändert hast, auch
funktioniert.


HTH,

Thomas

Re: DISTINCT, Sortierreihenfolge

am 03.03.2006 12:32:22 von Hartmut Holzgraefe

Michele Marsching wrote:
> Danke für den Rat... aber was wenn doch? Ich repariere hier an einem
> Tool rum, das genau solche Queries hat... wonach würde er sortieren
> bei
>
> SELECT ProdukteIx, WDate
> FROM Produkte
> GROUP BY ProdukteIx;
>
> mySQL kann es eben... was was geht wurde von meinem Vorgänger
> gemacht... :/

Wenn es unterschiedliche Werte für WDate innerhalb der Gruppe gibt
dann ist das Ergebnis nicht definiert, siehe:

http://dev.mysql.com/doc/refman/4.1/en/group-by-hidden-field s.html

Do not use this feature if the columns you omit from the GROUP BY
part are not unique in the group! You get unpredictable results.

--=20
Hartmut Holzgraefe, Senior Support Engineer .
MySQL AB, www.mysql.com

http://www.mysql.com/support/

Re: DISTINCT, Sortierreihenfolge

am 04.03.2006 03:10:16 von Michele Marsching

Danke für eure Antworten!

"nicht definiert" ist die Antwort, die ich erwartet und befürchtet
hatte. Habe es inzwischen geschafft dem werten Herrn zu sagen, er soll
sowohl in der DB, als auch im Programm Änderungen durchführen. Ich
hoffe er fragt mich, bevor er wieder so einen Blödsinn macht.
Immerhin: wieder was (nutzloses eigentlich, aber immerhin!) dazu
gelernt! :)

DANKE!

Michele