Select zum Minimum einer Gruppe

folgende Queries zur Bestimmung eines Minimums pro Gruppe sind problemloser Standard
[sql]
select gruppenId, min(einzelDate)
from (select gruppenId, einzelId, einzelDate
from komplex
where komplex) sub
group by gruppenId


oder schlicht:

select gruppenId, min(einzelDate)
from komplex
where komplex
group by gruppenId
[/sql]
ich möchte aber je Gruppe die einzelId des Eintrags mit dem minimalen Datum haben,
geht da irgendwas famoses mit Hauptziel Vermeidung doppelten Aufschreibens der komplexen FROM-WHERE-Query?

extra ne View möchte ich aber auch nicht, dann werde ich doch alle Einträge laden und in Java sortieren

Geht da nicht was mit “having”?

eher muss die ganze Gruppierung weg, denke ich,
aber
[sql]
select gruppenId, einzelId
from komplex
where komplex
and einzelDate = (select min(einzelDate) from komplex where komplex and aktuelle gruppenId …)
[/sql]
ist eben nicht mein Ziel,
Sub-Query in From hilft in meinen Augen bisher auch nicht

Ich hab das mal mit folgendem getestet:
[sql]DROP TABLE IF EXISTS komplex;
CREATE TABLE komplex (
einzelid integer,
gruppenId integer,
einzeldate integer
);

INSERT INTO komplex (einzelid,gruppenId, einzeldate) VALUES (1,1,1), (2,1,2), (3,1,3), (4,2,1), (5,2,2), (6,2,3), (7,3,1), (8,3,2), (9,3,3);
[/sql]

und die mit folgendem SQL
[sql]SELECT DISTINCT(gruppenId),
(SELECT min(einzeldate) FROM komplex WHERE gruppenId = k.gruppenId) AS einzeldate,
(SELECT einzelid FROM komplex WHERE gruppenId = k.gruppenId HAVING einzeldate = min(einzeldate)) AS einzelid
FROM komplex k[/sql]

folgende Ausgabe bekommen


gruppenId|einzeldate|einzelid
        1|         1|       1
        2|         1|       4
        3|         1|       7

ist das etwa das was du möchtest?


Konnte den SQL noch ein wenig vereinfachen:
[sql]SELECT gruppenid, min(einzeldate), (SELECT einzelid FROM komplex WHERE gruppenid=k.gruppenid AND einzeldate = k.einzeldate) AS einzelId
FROM komplex k
GROUP BY gruppenid[/sql]

in der zweiten Variante wie gesagt leider ‘komplex’ doppelt und Tabelle ist ja noch etwas mehr als eine View, die wie gesagt auch nicht so schön,
sind für mich also etwas zu starke Mittel, aber danke

Ja, da hätte ich mir mehr Zeit mit der Antwort lassen sollen. Erst elegant das Problem nur zur Hälfte wahr genommen und dann ohne es zu merken deinen Select nochmal nachgebaut :-/.

Aber gerade nochmal was ausprobiert (von dem ich der Meinung war es würde nicht funktionieren):

[sql]SELECT gruppenid, MIN( einzeldate ) , einzelid
FROM komplex
GROUP BY gruppenid[/sql]

läuft unter MySQL

freche Datenbank

Ich deute mal: bei dir läuft das nicht und er will einzelid im group-by gelistet haben. Mit welcher DB arbeitest du?

PostgreSQL, aber nach einzelnen Hacks geht es mir auch nicht,

wie wäre denn die offizielle Erklärung in MySQL, ist irgendwo eine Definition nachzulesen?
„wenn ein min() ausgeführt wird, dann kann man auch Attribute diese min-Eintrag einzeln abfragen“?
auf sowas würde ich selbst bei vorhandenen MySQL ungern verläßliche Anwendungen aufbauen,

was passiert eigentlich bei
[sql]
SELECT gruppenid, MIN( einzeldate ) , MAX( einzeldate ) , einzelid
FROM komplex
GROUP BY gruppenid
[/sql]
? :wink:
endlich auch Fehlermeldung?

oder teste mal nur mit MAX, ob da auch die Max-einzelId kommt, oder nicht schlicht irgendeine, bisher zufällig die vom min (ersten Eintrag?)

Ok vergiss es - wenn ich es mit MAX mache, dann sind die IDs die gleichen. Ergo nimmt er einfach die erste ID die er findet.