Laden...

[gelöst] SQL group by bedingt

Erstellt von demondriver235 vor 14 Jahren Letzter Beitrag vor 14 Jahren 967 Views
D
demondriver235 Themenstarter:in
496 Beiträge seit 2005
vor 14 Jahren
[gelöst] SQL group by bedingt

MySQL 5

ich hoffe jemand hat eine clevere idee wie man folgendes problem in einer abfrage lösen kann.

bsp

datum1 datum2 kw
2009-09-27 2009-09-29 40
2009-09-29 2009-09-30 40
2009-10-01 2009-10-02 40

diese daten möchte ich abfragen und nach kw gruppieren allerdings
dürfen die datensätze nur zusammengefasst (gruppiert) werden
wenn das max(datum1) < min(datum2) ist.

also wenn ich einfach abfrage
select kw, max(datum1), min(datum2) from x group by kw

erhalte ich ja

kw max(datum1) min(datum2)
40 2009-10-01 2009-09-29

ich möchte aber dieses ergebnis

kw max(datum1) min(datum2)
40 2009-10-01 2009-10-02
40 2009-09-29 2009-09-29

"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."

J
1.114 Beiträge seit 2007
vor 14 Jahren

Schon folgendes probiert?

select kw, max(datum1), min(datum2) from x group by kw having max(datum1) < min(datum2)
D
demondriver235 Themenstarter:in
496 Beiträge seit 2005
vor 14 Jahren

in dem fall würden die datensätze bei denen die having clause zutriff ja weggefiltert, das will ich ja nicht ich möchte das die datensätzte nur anders gruppiert werden

"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."

J
1.114 Beiträge seit 2007
vor 14 Jahren

Ermittele doch einfach in einer getrenntren Abfrage erst dein Max(Datum1) und Min(Datum2) und nehme diese Werte als Vergleichswerte in der eigentlich Abfrage

select kw, max(datum1), min(datum2) from x group by kw where datum1 < @madDatum1 and datum2 > @minDatum2

o.ä.

Kann sein, dass ich noch nicht so richtig dein Problem verstanden habe.

D
demondriver235 Themenstarter:in
496 Beiträge seit 2005
vor 14 Jahren

die von mir genannten datensätze sind nur beispiele in der tabelle sind mehrere rows die auch noch nach anderen kritierien grupppiert werden, deshalb komme ich mir einer getrennten abfrage leider auch nicht weiter.

noch mal zum verständnis, ich möchte die datensätze nach kw gruppieren allerdings nur wenn im ergebniss der gruppierung immernoch das max(datum1) < min(datum2) ist.

"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."

S
27 Beiträge seit 2009
vor 14 Jahren

select kw, max(datum1), min(datum2) from x group by kw

erhalte ich ja

kw max(datum1) min(datum2)
40 2009-10-01 2009-09-29

ich möchte aber dieses ergebnis

kw max(datum1) min(datum2)
40 2009-10-01 2009-10-02
40 2009-09-29 2009-09-29

Hallo,

kannst du vielleicht ein paar mehr Datensätze zeigen? Mit diesen drei Zeilen ist es nicht erkennbar was du willst und das Ergebnis macht für mich leider auch keinen Sinn.

Bei "group by kw" kannst du nicht mehrere Datensätze mit der kw 40 erwarten.

D
demondriver235 Themenstarter:in
496 Beiträge seit 2005
vor 14 Jahren

da meine angaben anscheinend nicht zur verdeutlichung des problems nicht ausreichen mache ich jetzt genauere angaben.

ich habe mehrere, sage wir mal termine, jeder dieser termine hat einen frühesten zeitpunkt zu dem dieser ausgeführt werden muss und einen spätesten ich möchten nun mehrere termine die in die gleiche kw fallen zusammenfassen allerdings nur wenn sie der früheste und späteste termin sich nicht überschneiden.

mir ist klar das es so wie ich es in dem beispiel geschrieben habe nicht mehrere datensätze für kw 40 erwarten kann es fehlt halt noch etwas in der group by clause.
ich habe aber leider keine idee was.

"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."

95 Beiträge seit 2006
vor 14 Jahren

Hallo demondriver235,

ich hab mal was zusammengehackt.
Ich gehe allerdings davon aus, dass die Tabelle einen eindeutigen Schlüssel hat (in der Abfrage heißt das Feld "ID"), den ich zum Gruppieren "missbrauche".
Es funktioniert soweit ganz gut, allerdings bezweifle ich, dass die Performance bei vielen Datensätzen noch gewährleistet ist....

Select Max(a.datum1), Min(a.datum2), If(GrpHelper.GRP = 0, 0, ID) GRP1 , a.kw
  From PROBE a inner join (Select if(Max(b.datum1) < Min(b.datum2), 0, 1) GRP, b.kw
                             From PROBE b
                         Group By kw) GrpHelper
               on a.kw = GrpHelper.kw
 Group By GRP1, a.kw

Wenn zwei dasselbe tun, ist es noch lange nicht dasselbe
(Adelphi)

D
demondriver235 Themenstarter:in
496 Beiträge seit 2005
vor 14 Jahren

leider ist die tabelle eigendlicht ein view und hat keinen unique key aber deine idee sieht trotzdem interessant aus, ich versuch das mal trotzdem irgendwie umzusetzen.
erstmal besten dank, hoffe das klappt.

"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."

95 Beiträge seit 2006
vor 14 Jahren

Hallo,

so würde es auch ohne UK funktionieren:

Select Max(a.datum1), Min(a.datum2), If(GrpHelper.GRP = 0, 0, @rownum := @rownum + 1) GRP1 , a.kw
  From (SELECT @rownum:=0) RN,
       PROBE a inner join (Select if(Max(b.datum1) < Min(b.datum2), 0, 1) GRP, b.kw
                             From PROBE b
                         Group By kw) GrpHelper
               on a.kw = GrpHelper.kw
 Group By GRP1, a.kw

Wenn zwei dasselbe tun, ist es noch lange nicht dasselbe
(Adelphi)

D
demondriver235 Themenstarter:in
496 Beiträge seit 2005
vor 14 Jahren

D A N K E !!!

habs jetzt.

"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."