Select Distinct mit mehr als den Distinct Spalten

Hi
was du willst ist
SQL:
select Spalte1, Spalte2, Spalte3, first(Spalte4), first(Spalte5) from nowhere
group by Spalte1, Spalte2, Spalte3;
Sprechen wir von MySQL? Dann geht es wirklich nicht. Andere Datenbanken können das zum Teil. Z.B. Access, weil es da immer eine Reihenfolge der Datensätze gibt.
Wenn es aber MySQL ist wirst du doch höchst wahrscheinlich schon einen AutoIndex haben?
Wenn du die Daten roh anschaust (also Select * from nowhere) wie findest du dann manuell raus welcher der erste Wert ist? Wenn du das raus finden kannst, kannst du es auch mit einer Abfrage, wenn du das nicht kannst ist die Information gar nicht vorhanden und es geht auch mit einer Abfrage nicht.


Gruss
jei
 
Des Rätsels Lösung:

1. Ich arbeite auf einer Oracle-Datenbank
2. Das Stichwort ist "Analytische Funktionen". Damit kann ich das umsetzen, was ihr wahrscheinlich mit dem "AutoIndex" meitntet.
Über jede Duplicate von S1, S2, S3 wird nun eine Nummer kreirt. Somit hat jetzt jeder meiner Datensätze eine Nummer. Der erste pro grp eine 1, der zweite eine 2, usw. Joa ... und jetzt kann ich natürlich am schluss abfragen Where BLA = 1.

Aber hier mal als SQL:

SELECT
Spalte1,
Spalte2,
Spalte3,
Spalte4,
Spalte5,
FROM
(
SELECT
Spalte1,
Spalte2,
Spalte3,
Spalte4,
Spalte5,
RANK() OVER (PARTITION BY SPALTE1, SPALTE2, SPALTE3 ORDER BY SPALTE1 DESC) as MyRank
) HALLOWELT
WHERE
HALLOWELT.MyRank = 1
 
Zuletzt bearbeitet:
Hi,

1. Ich arbeite auf einer Oracle-Datenbank

sei bitte so nett und nenne nächstes Mal das DBMS gleich, am besten im Titel, wie im oben angepinnten Thread gewünscht. Danke.

2. Das Stichwort ist "Analytische Funktionen". Damit kann ich das umsetzen, was ihr wahrscheinlich mit dem "AutoIndex" meitntet.

Aber auch da verwendest Du ein Sortierkriterium, nämlich SPALTE1. Und die ist doch pro Gruppe bzw. Partition gleich, wenn ich die Oracle-Abfrage richtig verstehe...

LG
 
Aber auch da verwendest Du ein Sortierkriterium, nämlich SPALTE1. Und die ist doch pro Gruppe bzw. Partition gleich, wenn ich die Oracle-Abfrage richtig verstehe...
So wie ich das noch im Kopf habe (und ich arbeite zu wenig mir Oracle um sich darauf 100% verlassen zu können) arbeitet Oracle nicht nach dem FIFO-Prinzip (First In First Out) sondern sortiert die Daten automatisch nach der ersten Spalte (resp. nach dem Index falls einer vorhanden ist). Da die ersten 3 Spalten gleich sind wird also nach der vierten sortiert.

@BruderOli:
Da würde es mich nun interessieren ob es tatsächlich einen Unterschied zwischen deiner Abfrage und einer Abfrage ala
SQL:
SELECT Spalte1, Spalte2, Spalte3, min(Spalte4), min(Spalte5)
gibt.

Ich kenne Rank nicht, aber wenn ich das richtig verstehe will er die Reihenfolge an den ersten 3 Spalten ausmachen, was ja nicht geht da die gleich sind.
Übrigens hätte ich so eine Rank Funktion ganz gerne für MySQL :D
 
Hi,

So wie ich das noch im Kopf habe (und ich arbeite zu wenig mir Oracle um sich darauf 100% verlassen zu können) arbeitet Oracle nicht nach dem FIFO-Prinzip (First In First Out) sondern sortiert die Daten automatisch nach der ersten Spalte (resp. nach dem Index falls einer vorhanden ist). Da die ersten 3 Spalten gleich sind wird also nach der vierten sortiert.

Und das macht Oracle dann automatisch, wo er da doch explizit ein ORDER BY SPALTE1 drin hat?

LG
 
Ich seh das so, dass das Order by gar nicht bringt, da Spalte1 ja immer gleich ist (Ist gruppiert und er will ja pro Gruppe eine Reihenfolge erstellen).
 
Nur um euch mal kurz auf den laufenden zu halten. Es hat nicht funktioniert, ich dachte es nur zuerst ^^. Aber ich brauch nicht mehr lang, bis ich das Ergebnis hab. Ich werde dann mal posten, wie es dann wirklich funktioniert hat.
 
Zurück