ich wie die folgenden eine Tabelle haben:Vergleichen Zeilen in Oracle-Tabelle und aktualisieren passende diejenigen
**ID tDate Product Price Quantity BuySell Status**
1 10-May-17 pppp $12 20 Buy Null
2 12-May-17 tttt $10 20 Sell Null
3 12-May-17 tttt $10 20 Buy Null
4 18-May-17 pppp $14 20 Sell Null
5 18-May-17 pppp $14 20 Buy Null
6 18-May-17 pppp $14 20 Sell Null
Ich brauche das Feld mit dem Namen Status zu aktualisieren, und setzen Sie ihn auf ‚Matched‘, wo immer ein Paar gefunden wird mit gleichem tDate, Produkt, Preis und Quantität und NICHT gleich BuySell.
Es folgt das gewünschte Ergebnis:
**ID tDate Product Price Quantity BuySell Status**
1 10-May-17 pppp $12 20 Buy Null
2 12-May-17 tttt $10 20 Sell Matched
3 12-May-17 tttt $10 20 Buy Matched
4 18-May-17 pppp $14 20 Sell Matched
5 18-May-17 pppp $14 20 Buy Matched
6 18-May-17 pppp $14 20 Sell Null
Hinweis Wie 6 # stimmen nicht überein, weil es nur mit einem anderen null mithalten können.
Ich hoffe, ich kann dies mit einer einzigen SQL-Anweisung ausführen.
Was ich gerade mache, ist wahrscheinlich der schlechteste Ansatz: Ich lade in Pandas Datenrahmen in Python, und dann durchlaufen ich jede Zeile, die sie vergleicht.
s = "SELECT ID, Account, product, Price, tDate, BuySell, Qty" + \
"FROM Table " + \
"WHERE Status IS NULL " + \
"ORDER BY Account, product, tDate, Price, Qty"
df = pd.read_sql(s, conn)
for i in range(len(df.index)-1):
if df.iloc[i, 1] == df.iloc[i+1, 1] \
and df.iloc[i, 2] == df.iloc[i+1, 2] \
and df.iloc[i, 3] == df.iloc[i+1, 3] \
and df.iloc[i, 4] == df.iloc[i+1, 4] \
and df.iloc[i, 5] != df.iloc[i+1, 5] \
and df.iloc[i, 6] == df.iloc[i+1, 6]:
s = "UPDATE Temp_Fees " + \
"SET Strategy = 'UNALLOCATED \ CANCELLED' " + \
"WHERE ID = " + str(df.iloc[i,0]) + \
" OR ID = " + str(df.iloc[i + 1, 0])
#custom function that will execute and commit statement
bb.EXECUTE(s)
#avoid reading a matched row
i = i + 1
Danke
kann es pro Tag mehr als ein Paar von Buy-Sell sein? –
@vkp Ja, es ist sogar in dem Beispiel (Datensätze 4, 5, 6). Edit: Ich gebe zu, das Beispiel zeigt nicht explizit, dass es mehr als ein Match pro Tag geben kann, aber zusammen mit der Beschreibung "# 6 stimmt nicht überein, weil es nur mit einer anderen Null übereinstimmen kann", sagt es implizit. –
Bearbeiten Sie die Frage und erklären Sie, was zu tun ist, wenn Duplikate zwischen den Schlüsseln vorhanden sind. –