Einfache Distinct Abfrage

Peter21

Neuer Benutzer
Beiträge
2
Hallo zusammen möchte eine einfache Distinct Abfrage machen:

select
distinct gvkey, Name, Ort,Datum
from Tabell1

Allerdings schreibt er mir identische gvkeys mit rein. Wenn ich Name, Ort,Datum weglasse, funktioniert die Abfrage, sprich nur eine eindeutige GVKeys in der Tabelle. Kann mir jemand sagen wo der Fehler liegt?
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.582
Das DISTINCT bezieht sich nicht ausschließlich auf die Spalte gvkey sondern auf das gesamte Abfrage Ergebnis. Wenn also gvkey 2x Wert A hat und Name 2x Wert A hat wird es nur eine Zeile im Ergebnis geben. Wenn aber Name einmal A einmal B ist sind beide Erebnisse einmalig.

PS: GROUP BY ist eine Alternative wenn sich die anderen Spalten gut aggregieren lassen. Da du dort aber offensichtlich auch Textspalten hast (Name) wäre es wichtig festzulegen welcher Name angezeigt werden soll und ob das überhaupt Sinn ergibt im Ergebnis.
 
Zuletzt bearbeitet:

akretschmer

Datenbank-Guru
Beiträge
9.423
Das DISTINCT bezieht sich nicht ausschließlich auf die Spalte gvkey sondern auf das gesamte Abfrage Ergebnis. Wenn also gvkey 2x Wert A hat und Name 2x Wert A hat wird es nur eine Zeile im Ergebnis geben. Wenn aber Name einmal A einmal B ist sind beide Erebnisse einmalig.

PS: GROUP BY ist eine Alternative wenn sich die anderen Spalten gut aggregieren lassen. Da du dort aber offensichtlich auch Textspalten hast (Name) wäre es wichtig festzulegen welcher Name angezeigt werden soll und ob das überhaupt Sinn ergibt im Ergebnis.

Ich weiß nicht, ob M$SQL das auch kann: PostgreSQL kennt DISTINCT ON (spalte), das wäre hier vielleicht das, was der Fragesteller sucht.

Demo:
Code:
test=*# create table foo (c1 int, c2 int);
CREATE TABLE
test=*# copy foo from stdin;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 1  1
>> 1  2
>> 2  1
>> 2  2
>> 3  1
>> \.
test=*# select distinct c1, c2 from foo;
 c1 | c2
----+----
  2 |  2
  3 |  1
  1 |  2
  2 |  1
  1 |  1
(5 rows)

test=*# select distinct on (c1) c1, c2 from foo;
 c1 | c2
----+----
  1 |  1
  2 |  1
  3 |  1
(3 rows)

test=*# select distinct on (c1) c1, c2 from foo order by c1, c2 desc;
 c1 | c2
----+----
  1 |  2
  2 |  2
  3 |  1
(3 rows)
 
Werbung:
Oben