kleinster Wert bei gleicher ID

chris69

Benutzer
Beiträge
13
Hi,

war mal und bin immernoch ein Neueinsteiger, such seit 2 Stunden im Netz und find nichts zu meinem Problem.

wie finde ich immer den niedrigsten Wert in einer Spalte, bei gleicher ID und gleichem Namen?

z.B.

ID Name Wert
100 Hans 7
100 Hans 4
100 Hans 12
120 Peter 5
120 Peter 4

Ergebnis sollte die 2. und 5. Zeile sein

danke an Hilfe

Chris
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.423
Hi,

war mal und bin immernoch ein Neueinsteiger, such seit 2 Stunden im Netz und find nichts zu meinem Problem.

wie finde ich immer den niedrigsten Wert in einer Spalte, bei gleicher ID und gleichem Namen?

z.B.

ID Name Wert
100 Hans 7
100 Hans 4
100 Hans 12
120 Peter 5
120 Peter 4

Ergebnis sollte die 2. und 5. Zeile sein

danke an Hilfe

Chris


Code:
test=*# select * from chris ;
 id  | name  | wert
-----+-------+------
 100 | hans  |  7
 100 | hans  |  4
 100 | hans  |  12
 120 | peter |  5
 120 | peter |  4
(5 rows)

Time: 0,181 ms
test=*# select id, name, min(wert) from chris group by id, name;
 id  | name  | min
-----+-------+-----
 120 | peter |  4
 100 | hans  |  4
(2 rows)

Deine Spalten id und name sind redundant, das macht man nicht.
 

chris69

Benutzer
Beiträge
13
Hallo akretschmer,

dein "redundant" hat mich verwirrt.

Obige Daten hab ich nur als Beispiel genommen und mich damit doch etwas "vertan". Auf dem 1.Blick hat alles gepasst. Auf dem 2. auch, auf dem 3. dann nicht mehr ;-)

Ein besseres Bsp.:

ID Name Wert
100 Hans 5
100 Hans 7
100 Peter 4
120 Hans 8
120 Peter 5
120 Hans 4

Ergebnis soll jeweils die Zeile sein, mit dem niedrigsten Wert und dem Namen "Hans",
also die 1. und letzte

im Beispiel von heut Nachmittag fingen an sich die Ergebnisse zu vermischen.


Falls MySql ein weniger gute Wahl ist, welche ist eine Bessere? Und Warum?

danke an Antwort(en)

Chris
 

akretschmer

Datenbank-Guru
Beiträge
9.423
Hallo akretschmer,

dein "redundant" hat mich verwirrt.

Okay ;-)


Obige Daten hab ich nur als Beispiel genommen und mich damit doch etwas "vertan". Auf dem 1.Blick hat alles gepasst. Auf dem 2. auch, auf dem 3. dann nicht mehr ;-)

Sowas dachte ich mir schon...

Ein besseres Bsp.:

ID Name Wert
100 Hans 5
100 Hans 7
100 Peter 4
120 Hans 8
120 Peter 5
120 Hans 4

Ergebnis soll jeweils die Zeile sein, mit dem niedrigsten Wert und dem Namen "Hans",
also die 1. und letzte

Also brauchst die ID - Spalte nicht, ja? Dann weglassen, select name, min(wert) from table group by name.

im Beispiel von heut Nachmittag fingen an sich die Ergebnisse zu vermischen.

Klar. Entweder war es redundant (das schrieb ich) oder von Dir schlicht falsch.

Falls MySql ein weniger gute Wahl ist, welche ist eine Bessere? Und Warum?

danke an Antwort(en)

Chris

MySQL ist voll von Bugs und es fehlen tausende Dinge, die man von einer DB heutzutage erwartet. MySQL gehört jetzt zu Oracle, die haben mit ihrer gleichnamigen DB ein sehr teures Pferd im Stall. Nur ganz dumme denken, daß da MySQL noch wesentlich verbessert werden wird in absehbarer Zeit.

Eine deutlich bessere Wahl wäre PostgreSQL. Das ist viel näher am SQL-Standard und kann Dinge, wo sogar Oracle schlecht dasteht. Das alles jetzt aufzuzählen wäre etwas lang, ich hab das (ansatzweise) hier auch schon so 2-3 Mal gemacht. Aber um mal so einige Dinge (nochmals) zu nennen:

  • kostenbasierter Planner/Optimizer
  • partielle/funktionale Indexe, erweiterbar, pro Table & Query mehr als 1 Index nutzbar
  • viele eingebaute Datentypen wie z.B. RANGE-Typen, Netzwerktypen, Arrays, HSTORE (als Key-Value-Store), JSON, XML
  • komplexe analystische Abfragen (WITH-Abfragen, recursive Abfragen, Window-Funktionen)
  • fast alles geht in einer Transaction, auch DDL-Befehle
  • CREATE INDEX CONCURRENTLY - Fähigkeit (erstellt Indexe ohne Sperren)
  • Dinge wie CHECK-Constraints werden beachtet ;-) (und nicht nur syntaktisch angenommen, aber ignoriert)
  • sehr, sehr nah an diversen SQL-Specs, dabei aber viele sinnvolle Erweiterungen
  • man kann in pl/pgsql, pl/perl, pl/phyton, pl/v8 und so weiter innerhalb der DB programmieren

Einfach mal anschauen, ...
 

chris69

Benutzer
Beiträge
13
Hi,

die ID brauch ich auch,

jede ID hab mehrere hundert male, unterteilt in bis zu 20 dieser "Namen", jeder Name hat dutzende Werte, ...

ich brauch davon immer nur eine bestimmte Info, in dem Beispiel die Kleinsten dieser Werte

Chris
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.423
Hi,

die ID brauch ich auch,

jede ID hab mehrere hundert male, unterteilt in bis zu 20 dieser "Namen", jeder Name hat dutzende Werte, ...

ich brauch davon immer nur eine bestimmte Info, in dem Beispiel die Kleinsten dieser Werte

Chris


Dann definiere eine Regel, welchen der Namen Du da sehen willst. Überleg es Dir rein logisch: wenn Du je ID den kleinsten Wert haben willst, und es verschiedene Namen gibt, dann mußt Du definieren, nach welchen Namen die Gruppierung erfolgen soll. Das könnte z.B. alphabetisch sortiert sein.

Folgendes ist eine PG-Erweiterung: DISTINCT ON:

Code:
test=*# insert into chris values (100, 'otto', 3);
INSERT 0 1
Time: 0,205 ms
test=*# select * from chris ;
id  | name  | wert
-----+-------+------
100 | hans  |  7
100 | hans  |  4
100 | hans  |  12
120 | peter |  5
120 | peter |  4
100 | otto  |  3
(6 rows)

Time: 0,184 ms
test=*# select distinct on (id) id, name, wert from chris order by id, wert;
id  | name  | wert
-----+-------+------
100 | otto  |  3
120 | peter |  4
(2 rows)

Andreas
 
Oben