PDA

View Full Version : SQL - Höchsten Datumswert eines Kunden anzeigen lassen



Seiten : [1] 2 3

svente
25-10-16, 09:52
Servus,

ich möchte aus einer Kundendatei pro Kunde den höchsten Datumswert anzeigen lassen.
Kunde kann mehrere Einträge haben. GADAT ist "gültig ab" Datumsfeld.

Bei dem Bsp. bekomme ich das ja noch hin mit Max(GADAT) und GROUP auf Kdnr.
Was mache ich aber wenn ich noch die ganzen Adressdaten(Name2, Str, Plz und Ort) mit
anzeigen lassen möchte?

Bsp.


<tbody>
Kdnr

GADAT



701350

2008/07



701350

2010/12



701350




701450

2012/05



701450

2017/01






</tbody>

BenderD
25-10-16, 10:24
... wenn denn Deine Kdnr primary key ist, kannst Du einfach max(xxx) oder MIN(xxx) nehmen.

D*B

B.Hauser
25-10-16, 10:43
Sofern im Datensatz noch andere Informationen enthalten sind, die Du sehen willst ...
Ermittle die eindeutigen Schlüssel-Daten und das höchste Datum in einer CTE (Common Table Expression) oder verschachtelten Select-Anweisung und verknüpfe das Ergebnis über den Unique Key (z.B. Kunden-Nr.) und das Datum mit dem eigentlichen Datensatz.
Bei einen zusammengesetzten Schlüssel, musst Du natürlich auf diesen zusammengesetzten Schlüssel verdichten.


With x as (Select KundeNr, Max(GueltDat) MaxDat
From YourTable
Where ....
Group By KundeNr)
Select a.*
From x join YourTable a on x.KundeNr = a.KundeNr and MaxDat = GueltDat
...


Birgitta

Fuerchau
25-10-16, 11:12
Warum so kompliziert?
Dieters Lösung ist doch viel einfacher:

select k1, k2, ..., max(f1), max(f2), ...
from myfile
group by k1, k2, ...

Wenn ich einen Join vermeiden kann, lass ich es auch.

Pikachu
25-10-16, 11:19
Und wenn ein Kunde umzieht?


Warum so kompliziert?
Dieters Lösung ist doch viel einfacher:

select k1, k2, ..., max(f1), max(f2), ...
from myfile
group by k1, k2, ...

Wenn ich einen Join vermeiden kann, lass ich es auch.

B.Hauser
25-10-16, 11:20
Warum so kompliziert?
Dieters Lösung ist doch viel einfacher:

select k1, k2, ..., max(f1), max(f2), ...
from myfile
group by k1, k2, ...

Wenn ich einen Join vermeiden kann, lass ich es auch.

Ich denke nicht, dass diese Abfrage das gewünschte Ergebnis zurückbringt.
Beispiel:
Kunde = 1000, GueltDat = 2016-10-20, F1 = X, F2 = C
Kunde = 1000, GueltDat = 2016-10-15, F1 = Z, F2 = W
Kunde = 1000, GueltDat = 2016-10-10, F1 = A, F2 = Z

Dein Beispiel würde folgendes zurück bringen:
Kunde = 1000, GueltDat = 2016-10-20, F1 = Z, F2 = Z

Gewünchst war aber:
Kunde = 1000, GueltDat = 2016-10-20, F1 = X, F2 = C

Birgitta

Fuerchau
25-10-16, 11:46
Du musst du Leute nicht immer mit Abstraktion verwirren:

"Was mache ich aber wenn ich noch die ganzen Adressdaten(Name2, Str, Plz und Ort) mit
anzeigen lassen möchte?"

Mein Verständnis hier ist einfach, dass diese Daten sich beim Kunden nicht ändern, daher reicht Dieters Lösung.
Hinzu käme bei einer Normalisierung eigentlich ein Join auf den Kundenstamm ohne Datumsbezug und dann reicht auch ein MIN(KDST.Name).

BenderD
25-10-16, 12:13
... am elegantesten wäre es ohnehin neben gültig ab noch gültig bis mit hinzu zu nehmen und beim letzten Higval reinzuschreiben. Wird ein neuer angelegt, muss der alte terminiert werden und ein neuer eingefügt werden (am besten mit Trigger), dann kann man für jedes beliebige Datum mit between den gültigen fischen. Diese Variante ist auch von der Performance bei weitem die Beste, da nur ein Satz gelesen werden muss.

D*B

KingofKning
22-02-17, 09:39
Hallo *all,

ich möchte das Thema nochmals aufgreifen:

Ich habe eine Adressdatei und dazu die Auftragsdaten.

Ich möchte jetzt jeweils zu dem Kunden den Satz mit dem höchsten Auftragsdatum haben.



with x as (select akkto, max(akkdn1) Datum from kndauf
group by akkto)
select t01.adkto, Datum
from x join adr01pf t01 on x.akkto = t01.adkto




Dummerweise bekomme ich jetzt aber folgendes Angezeigt:



1026 20.150.930
1026 20.150.930
1026 20.150.930
1026 20.150.930
1026 20.150.930
1026 20.150.930
1026 20.150.930



Sprich für jeden Satz in der Auftragsdatei zeigt er mir das höchste Datum an. Ich will es aber nur einmal pro Kunde haben.

Wo ist mein Denkfehler?

GG 4847

Fuerchau
22-02-17, 10:06
Nimm in den Join noch das Datum als Bezug auf. Schließlich ist das ja dieser Satz.
Sollttest du allerdings mehr als 1 Auftrag für einen Tag haben so musst du ggf. noch den letzten Auftrag dazunehmen.