Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

kleinster Wert bei gleicher ID

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von chris69, 24 November 2013.

  1. chris69

    chris69 Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru


    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.
     
  3. chris69

    chris69 Benutzer

    danke, passt genau und bringt mich weiter!
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Da Du Neueinsteiger bist möcht ich Dir ans Herz legen, vielleicht doch nicht MySQL zu nutzen. Du wirst eines Tages größere Aufgaben haben und dann merken, daß MySQL nicht die beste Wahl ist.
     
  5. chris69

    chris69 Benutzer

    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
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Okay ;-)


    Sowas dachte ich mir schon...

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

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

    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, ...
     
  7. chris69

    chris69 Benutzer

    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
     
  8. akretschmer

    akretschmer Datenbank-Guru


    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
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden