2017-05-16 4 views
1

Ich habe ein Beispiel dafür, wie meine Daten aussieht. Die Tabelle enthält negative Kundensalden. Jeden Tag wird ein Bericht mit einer Kundennummer generiert, die einen negativen Saldo hat. Der Bericht wird mit einem neuen Berichtdatum in meine Tabelle importiert. Gibt es eine Möglichkeit für mich, folgendes zu erreichen:Bereinigen von Daten, wo es täglich wiederholt

Zeilen am ersten Datum zurückgeben, an dem die customerID ihren maximalen ending_amount erreicht hat. Das heißt, wenn eine customerid eine ending_amount von -3.50 am Tag 10 von 20 Tagen der Daten erreicht, möchte ich, dass die Datenzeile nur am Tag 10 von 20 zurückgegeben wird und die anderen 19 Tage der Daten ignoriert werden, die dieser customerid zugeordnet sind.

Hinweise:

** - ** customerId ist ein eindeutiger Wert.

** - ** wenn start_amount <> ending_amount, zeigt dies an, dass eine Änderung in Bezug auf diesen Kontostand stattgefunden hat.

Gibt es auf jeden Fall kann ich mein Ziel erreichen, indem Sie entweder diese Tabelle aufräumen oder indem Sie eine Abfrage schreiben?

Vielen Dank für Ihre Hilfe.

Expected Data output 

reportdate customerid starting_amount ending_amount 
    1/1/17  2   -0.00   -0.50 
    1/3/17  3   -0.50   -1.00 
    1/4/17  1   -0.50   -3.27 
    1/4/17  4   -0.00   -0.50 
    1/4/17  5   -0.50   -1.32 

Beispieldaten

tbl_accountchange 

reportdate customerid starting_amount ending_amount 
    1/1/17  1    -0.00   -0.50 
    1/1/17  2    -0.00   -0.50 
    1/2/17  1    -0.50   -0.50 
    1/2/17  2    -0.50   -0.50 
    1/2/17  3    -0.00   -0.50 
    1/3/17  1    -0.50   -0.50 
    1/3/17  2    -0.50   -0.50 
    1/3/17  3    -0.50   -1.00 
    1/3/17  4    -0.00   -0.50 
    1/3/17  5    -0.00   -0.50 
    1/4/17  1    -0.50   -3.27 
    1/4/17  2    -0.50   -0.50 
    1/4/17  3    -1.00   -1.00 
    1/4/17  4    -0.50   -0.50 
    1/4/17  5    -0.50   -1.32   
+0

Also in Ihrem Datensample was wäre die erwartete Ausgabe? –

+0

Hallo, ich habe meine gewünschte Ausgabe hinzugefügt. Im Wesentlichen möchte ich jede Zeile des ersten Berichtsdatums zurückgeben, dass das Konto seinen maximalen Endstand innerhalb der Tabelle erreicht hat. Eine Kunden-ID sollte nicht mehr als einmal zurückgegeben werden. –

Antwort

0

Um die maximale End Betrag für jeden Kunden zu finden:

select customerId, max(ending_amount) max_ea 
from tbl_accountchange 
where reportdate between '2017-01-01' and '2017-01-20' 
group by 1 

dem frühestmöglichen Termin dieser Wert für jeden Kunden aufgetreten zu finden:

select a.customerId, min(reportdate) rd 
from tbl_accountchange a 
join (
    -- above query 
) b on a.customerId = b.customerId 
    and a.ending_amount = max_ea 
group by 1 

Die ganze Abfrage:

select t.* 
from tbl_accountchange t 
join (select a.customerId, min(reportdate) rd 
    from tbl_accountchange a 
    join (
     select customerId, max(ending_amount) max_ea 
     from tbl_accountchange 
     where reportdate between '2017-01-01' and '2017-01-20' 
     group by 1 
    ) b on a.customerId = b.customerId 
    and a.ending_amount = max_ea 
    where reportdate between '2017-01-01' and '2017-01-20') c 
    on t.customerId = c.customerId 
    and t.reportdate = c.reportdate 

Keine der Abfragen korreliert, so sollte es auch für große Datensätze ziemlich gut funktionieren.

Beachten Sie, dass die Datumsbereichsbedingung in beiden Unterabfragen enthalten sein muss.

+0

Ich habe eine weitere Parantheses hinzugefügt, bevor ich die Tabelle als c aliasing. Die Antwort, die ich erhalte, ist Spalte calendar in Feldliste ist mehrdeutig? –

+0

@EdwardKo Wenn Sie einen solchen Fehler erhalten, müssen Sie angeben, von welcher Tabelle die von Ihnen ausgewählte Spalte stammt. In diesem Fall habe ich es durch Hinzufügen von 'a. vor dem Spaltennamen behoben - siehe bearbeitete Antwort. Zusätzliche Klammern sollten nicht erforderlich sein. (Übrigens habe ich diese Frage im Bus abgetippt, so dass ich wahrscheinlich ein kleines Detail übersehen würde) – Bohemian

Verwandte Themen