meierjo
Goto Top

MS-SQL Group by, aber nur mit jüngerem Datum

Hallo

Ich bin mit dem Einstieg in SQL-Statements beschäftigt, bin also noch neu in diesem Gebiet

Folgende Tabelle existiert:

I_nr D_gueltiG_Ab DC_kalk_STD_Satz
----------------------- ---------------------------------------
1 2007-06-01 00:00:00.000 100.00
2 2007-06-01 00:00:00.000 120.00
2 2008-10-01 00:00:00.000 130.00
3 2007-06-01 00:00:00.000 120.00
3 2008-10-01 00:00:00.000 130.00
4 2007-06-01 00:00:00.000 60.00
4 2008-10-01 00:00:00.000 70.00
5 2007-06-01 00:00:00.000 60.00
5 2008-10-01 00:00:00.000 70.00
6 2007-07-03 00:00:00.000 60.00
6 2008-10-01 00:00:00.000 70.00
7 2007-06-01 00:00:00.000 130.00
7 2008-10-01 00:00:00.000 140.00
8 2007-06-01 00:00:00.000 60.00
8 2008-10-01 00:00:00.000 70.00
9 2007-06-01 00:00:00.000 130.00
9 2008-10-01 00:00:00.000 140.00
10 2007-06-01 00:00:00.000 60.00
10 2008-10-01 00:00:00.000 70.00
11 2007-06-01 00:00:00.000 130.00
11 2008-10-01 00:00:00.000 140.00
12 2007-06-01 00:00:00.000 60.00
12 2008-10-01 00:00:00.000 70.00

wie ihe sehen könnt, existiert die I_nr teilweise mehrfach (fragt nicht warum, ich habe die Tabelle nicht erstellt)

Ich möchte nun mit einem Statement pro I_Nr eine Zeile erhalten. So weit kein Problem, liesse sich per select distinct oder Group by umsetzen.

Ich möchte aber dort, wo die selbe I-Nr mehrmals vorkommt nur die Zeile mit dem jüngeren Datum erhalten.

Ist für euch Programmierprofis wohl ein Klacks, aber mir steht da irgendwie einer auf dem Schlauch

Gruss Meierjo

Content-Key: 142973

Url: https://administrator.de/contentid/142973

Printed on: April 23, 2024 at 22:04 o'clock

Member: godlie
godlie May 17, 2010 at 14:18:37 (UTC)
Goto Top
Hallo,
einfach ein Order by Datum Desc und Limit 1 damit erhälst den jüngsten Eintrag afaik.
Member: Meierjo
Meierjo May 17, 2010 at 14:49:26 (UTC)
Goto Top
Hallo Godlie

Besten Dank für die prompte Antwort.

Der Befehl oder die Option Limit scheint aber aus MySql zu stammen, und kann in MSSQL nicht verendet werden.

Gruss Meierjo
Member: it-frosch
it-frosch May 17, 2010 at 15:24:46 (UTC)
Goto Top
Hallo Meierjo,

select [D_gueltiG_Ab],[I_nr], [DC_kalk_STD_Satz] from [DB].[dbo].[tabelle]
order by [D_gueltiG_Ab] desc


MSSQL hat übrigends auch eine Hilfe. face-wink
Member: Meierjo
Meierjo May 17, 2010 at 17:56:17 (UTC)
Goto Top
Hallo IT-Frosch

Danke für die Rückmeldung

Mit deinem Statement bekomme ich aber alle I_nr ausgewiesen.
Ich möchte aber dort , wo mehrere Einträge pro I_nr stehen (ZB I_nr 02, 03 oder 04) nur den Datensatz mit dem jüngeren Datum (ZB 2008-10-01 00:00:00.000 ) erhalten

Gruss und schönen Abend
Member: Biber
Biber May 17, 2010 at 18:38:25 (UTC)
Goto Top
Moin Meierjo,

dann musst du die Tabelle zweimal im Select haben , einmal satzweise und einmal els SubSelect mit GROUP BY [I_nr] und über den MIN()-Wert von [D_gueltig_ab] verjoinen.
Ist aber alles gequirte...s Suboptimum, weil
  • keiner von uns den Primaray Key, das allein identifizierende Merkmal eines Satzes kennt
  • weil es logisch nicht sein kann, dass mehrere Sätze mit der ID x (z.B. 7) beide "gueltig_ab" irgendwann sind und beide immer noch "gueltig_bis" zur Schalke-Meisterschaftsfeier sein werden
  • weil diese Liste nach deinen Vorgaben generiert dementsprechend vollkommen willkürlich irgendwelche Stundensätze aus diesem und aus vergangenen Jahren in einen Kontext bringt, der absoluter Quark ist.

Sinngemäß (bei sinnvoll kombinierbaren Sätzen!) wäre das Muster in etwa:
SELECT a.I_nr, a.D_Gueltig_ab, a.DC_Std_Satz from [DB].[dbo].[tabelle] as a,
        (SELECT  I_nr, Min(D_Gueltig_ab) as min_Gueltig_Ab  
                From DB].[dbo].[tabelle] 
                    Group By I_Nr) b
Where a.I_nr = b.I_nr
And a.D_gueltig_ab = B. Min_Gueltig_ab
Order by 1

Grüße
Biber
Member: Meierjo
Meierjo May 18, 2010 at 04:54:52 (UTC)
Goto Top
Hallo Biber

Dnke dir, deine Lösung funktioniert.

weil es logisch nicht sein kann, dass mehrere Sätze mit der ID x (z.B. 7) beide "gueltig_ab" irgendwann sind und beide immer noch "gueltig_bis" zur Schalke-Meisterschaftsfeier sein werden
Darüber hab ich mich auch schon gewundert, dachte mir aber, der Profi, der die Datenbank erstellt hat, wird sich schon was gedacht haben. Aber wie gesagt, die Tabelle ist nicht von mir, ich beschäftige mich nur damit, Daten aus dieser Tabelle zu lesen.

Danke dir herzlich für deine Hilfe.

Gruss Meiero