SQL server wählt maximales date pro ID aus

Ich versuche, für jeden service_user_id für jede finance_charge_id und den Betrag zu wählen, der das höchste date verknüpft ist

select distinct s.Finance_Charge_ID, MAX(s.start_date), s.Amount from Service_User_Finance_Charges s where s.Service_User_ID = '156' group by s.Finance_Charge_ID, s.Amount 

Das Problem ist, dass ich mehrere Einträge erhalten, wo der Betrag anders ist. Ich möchte nur den Betrag für den letzten Termin für jede finance_charge_id erhalten

Im Moment bekomme ich die unten, die falsch ist (die dritte Zeile sollte nicht erscheinen, da die 1. Zeile ein höheres date hat)

 Finance_Charge_ID (No column name) Amount 2 2014-10-19 1.00 3 2014-10-16 500.00 2 2014-10-01 1000.00 

Entfernen Sie die Amount aus der Gruppe, um die richtigen Zeilen zu erhalten. Du kannst dann diese Abfrage wieder auf den Tisch bringen, um alle benötigten data zu erhalten. Hier ist ein Beispiel mit einem CTE, um die max Termine zu bekommen:

 WITH MaxDates_CTE (Finance_Charge_ID, MaxDate) AS ( select s.Finance_Charge_ID, MAX(s.start_date) MaxDate from Service_User_Finance_Charges s where s.Service_User_ID = '156' group by s.Finance_Charge_ID ) SELECT * FROM Service_User_Finance_Charges JOIN MaxDates_CTE ON MaxDates_CTE.Finance_Charge_ID = Service_User_Finance_Charges.Finance_Charge_ID AND MaxDates_CTE.MaxDate = Service_User_Finance_Charges.start_date 

Dies kann mit einer windowsfunktion erfolgen, die die Notwendigkeit einer Selbstverknüpfung auf den gruppierten data entfernt:

 select Finance_Charge_ID, start_date, amount from ( select s.Finance_Charge_ID, s.start_date, max(s.start_date) over (partition by s.Finance_Charge_ID) as max_date, s.Amount from Service_User_Finance_Charges s where s.Service_User_ID = 156 ) t where start_date = max_date; 

Da die windowsfunktion nicht benötigt, dass Sie die group by Ihnen verwenden, können Sie jede zusätzliche Spalte hinzufügen, die Sie in der Ausgabe benötigen.