2016-06-02 13 views
1

Ich habe eine TXN-Tabelle mit Spalten ac_id, txn_amt. Es speichert die Daten txn Beträge zusammen mit Konto-IDs. Im Folgenden finden Sie Beispiel von DatenGruppierung von ähnlichen Daten nach Betrag in Oracle

AC_ID  TXN_AMT 
10   1000 
10   1000 
10   1010 
10   1030 
10   5000 
10   5010 
10   10000 
20   32000 
20   32200 
20   5000 

ich eine Abfrage so schreiben wollen, dass alle Beträge, die zusammen gruppiert werden innerhalb von 10% -Bereich der bisherigen Beträge sollten. Die Ausgabe sollte in etwa so aussehen:

AC_ID TOTAL_AMT TOTAL_CNT GROUP 
10  4040  4   1 
10  10010  2   2 
20  64200  2   3 
20  5000  1   4 

Ich versuchte mit LAG-Funktion, aber immer noch ahnungslos. Dies ist der Codeausschnitt, den ich versucht habe:

select ac_id, txn_amt, round((((txn_amt - lag(txn_amt, 1) over (partition by ac_id order by ac_id, txn_amt))/txn_amt)*100,2) as amt_diff_pct from txn; 

Jeder Hinweis oder Hilfe wird sehr geschätzt.

+1

Wie definieren Sie "vorherige Beträge"? SQL-Tabellen stellen ungeordnete Mengen dar, daher gibt es keine * vorherigen * Zeilen, es sei denn, eine Spalte enthält explizit die Reihenfolge. –

+0

Das ist, warum ich LAG-Funktion verwende, es ist Partitionierung von ac_id und Bestellung von ac_id und txn_amt – Sid

Antwort

4

Wenn durch vorherige Sie meinen "die größte Menge weniger als", dann können Sie dies tun. Sie können herausfinden, wo die Lücken sind (d. H. Größer als 10% Unterschied). Dann können Sie eine Gruppe zuordnen, indem Sie die Anzahl der Lücken zählen:

+0

Vielen Dank. Genau das habe ich gesucht. – Sid