Ich habe ein Schema ähnlich dem gezeigten und muss Transaktionsinformationen abrufen.
[img]https://i .sstatic.net/xVhLpCri.jpg[/img]
Ich möchte Datensätze aus der CUSTOMER-Tabelle mit denen in der TRANSACTION-Tabelle abgleichen.
Zuvor , wir haben uns ausschließlich auf die verlassen CUSTOMER_ID-Feld für den Abgleich.
Wir haben jedoch beobachtet, dass die TRANSACTION-Tabelle mehrere Datensätze mit derselben CUSTOMER_ID enthält.
Um dies zu beheben, müssen wir einen Algorithmus definieren, der Fälle verarbeiten kann, in denen es mehrere Übereinstimmungen gibt Datensätze für dieselbe CUSTOMER_ID.
Die Lösung sollte basierend auf den folgenden Kriterien übereinstimmen:
TRANSACTION.ADDRESS = CUSTOMER.ADDRESS (diese Bedingung sollte optional sein, wenn das Feld ADDRESS vorhanden ist).
In Fällen, in denen mehrere Zeilen übereinstimmen, wählen Sie die Transaktion mit dem frühesten ISSUE_DATE aus, vorausgesetzt, dass CUSTOMER.CREATED_AT {
StringBuffer qryStr = new StringBuffer() //
.append(
"SELECT "
+ " er.CUSTOMER_ID, "
+ " er1.ID, "
+ " er1.DESCRIPTION, "
+ " er1.REFERENCE_NUMBER, "
+ " er1.CATEGORY "
+ " FROM TRANSACTION er "
+ " INNER JOIN DETAILS er1 "
+ " ON (er.ID = er1.EM_ID) "
+ " WHERE "
);
public List searchTransactions(List criteria)
and the query to be as below
StringBuffer qryStr = new StringBuffer() //
.append(
"SELECT "
+ " er.CUSTOMER_ID, "
+ " er1.ID, "
+ " er1.DESCRIPTION, "
+ " er1.REFERENCE_NUMBER, "
+ " er1.CATEGORY "
+ " FROM TRANSACTION er "
+ " INNER JOIN DETAILS er1 "
+ " ON (er.ID = er1.EM_ID) "
+ " WHERE er.CUSTOMER_ID = ?customerId "
+ " AND SUBSTR(er.ACCOUNT_NUMBER, INSTR(er.ACCOUNT_NUMBER, '.') + 1) = ?accountNumber "
+ " AND (er.ADDRESS = ?address OR ?address IS NULL ) "
+ " AND er.ISSUE_DATE = ( "
+ " SELECT MIN(em2.ISSUE_DATE) "
+ " FROM TRANSACTION em2 "
+ " WHERE er.CUSTOMER_ID = em2.CUSTOMER_ID "
+ " AND er.ACCOUNT_NUMBER = em2.ACCOUNT_NUMBER "
+ " AND (er.ADDRESS = em2.ADDRESS OR ?address IS NULL )"
+ " AND em2.ISSUE_DATE >= ?createdAt)");
Query query = em.createNativeQuery(qryStr.toString());
query.setParameter("customerId", criteria.getCustomerId());
query.setParameter("accountNumber", criteria.getAccountNumber());
query.setParameter("address", criteria.getAddress());
query.setParameter("createdAt", criteria.getCreatedAt());
Mit dem oben genannten Ansatz muss ich so viele Abfragen ausführen, wie es Kriterien gibt, was die Leistungsvorteile, die durch die Stapelverarbeitung in der vorherigen Implementierung erzielt wurden, zunichte macht.
Gibt es eine bessere Möglichkeit, damit umzugehen?
Könnten wir beispielsweise die vorherige Abfrage verwenden, um alle erforderlichen Daten abzurufen, und dann im Falle doppelter CUSTOMER_IDs eine zweite Abfrage durchführen, um Konflikte zu lösen?
Ich habe ein Schema ähnlich dem gezeigten und muss Transaktionsinformationen abrufen. [img]https://i .sstatic.net/xVhLpCri.jpg[/img]
Ich möchte Datensätze aus der CUSTOMER-Tabelle mit denen in der TRANSACTION-Tabelle abgleichen. Zuvor , wir haben uns ausschließlich auf die verlassen CUSTOMER_ID-Feld für den Abgleich. Wir haben jedoch beobachtet, dass die TRANSACTION-Tabelle mehrere Datensätze mit derselben CUSTOMER_ID enthält. Um dies zu beheben, müssen wir einen Algorithmus definieren, der Fälle verarbeiten kann, in denen es mehrere Übereinstimmungen gibt Datensätze für dieselbe CUSTOMER_ID. Die Lösung sollte basierend auf den folgenden Kriterien übereinstimmen: [list] [*]TRANSACTION.CUSTOMER_ID = CUSTOMER.CUSTOMER_ID. [*]SUBSTR(TRANSACTION.ACCOUNT_NUMBER, INSTR(TRANSACTION.ACCOUNT_NUMBER, '.') + 1) = CUSTOMER.ACCOUNT_NUMBER. [*] TRANSACTION.ADDRESS = CUSTOMER.ADDRESS (diese Bedingung sollte optional sein, wenn das Feld ADDRESS vorhanden ist). [*]In Fällen, in denen mehrere Zeilen übereinstimmen, wählen Sie die Transaktion mit dem frühesten ISSUE_DATE aus, vorausgesetzt, dass CUSTOMER.CREATED_AT { StringBuffer qryStr = new StringBuffer() // .append( "SELECT " + " er.CUSTOMER_ID, " + " er1.ID, " + " er1.DESCRIPTION, " + " er1.REFERENCE_NUMBER, " + " er1.CATEGORY " + " FROM TRANSACTION er " + " INNER JOIN DETAILS er1 " + " ON (er.ID = er1.EM_ID) " + " WHERE " );
ret = results.stream() .map(erm -> Details.toModel(erm)) .collect(Collectors.toList());
return ret; } [/code] Ich denke also, dass der Parameter der Methode eine Liste aller Felder von CUSTOMER sein sollte. [code]public List searchTransactions(List criteria)
and the query to be as below StringBuffer qryStr = new StringBuffer() // .append( "SELECT " + " er.CUSTOMER_ID, " + " er1.ID, " + " er1.DESCRIPTION, " + " er1.REFERENCE_NUMBER, " + " er1.CATEGORY " + " FROM TRANSACTION er " + " INNER JOIN DETAILS er1 " + " ON (er.ID = er1.EM_ID) " + " WHERE er.CUSTOMER_ID = ?customerId " + " AND SUBSTR(er.ACCOUNT_NUMBER, INSTR(er.ACCOUNT_NUMBER, '.') + 1) = ?accountNumber " + " AND (er.ADDRESS = ?address OR ?address IS NULL ) " + " AND er.ISSUE_DATE = ( " + " SELECT MIN(em2.ISSUE_DATE) " + " FROM TRANSACTION em2 " + " WHERE er.CUSTOMER_ID = em2.CUSTOMER_ID " + " AND er.ACCOUNT_NUMBER = em2.ACCOUNT_NUMBER " + " AND (er.ADDRESS = em2.ADDRESS OR ?address IS NULL )" + " AND em2.ISSUE_DATE >= ?createdAt)");
Query query = em.createNativeQuery(qryStr.toString()); query.setParameter("customerId", criteria.getCustomerId()); query.setParameter("accountNumber", criteria.getAccountNumber()); query.setParameter("address", criteria.getAddress()); query.setParameter("createdAt", criteria.getCreatedAt()); [/code] Mit dem oben genannten Ansatz muss ich so viele Abfragen ausführen, wie es Kriterien gibt, was die Leistungsvorteile, die durch die Stapelverarbeitung in der vorherigen Implementierung erzielt wurden, zunichte macht. Gibt es eine bessere Möglichkeit, damit umzugehen? Könnten wir beispielsweise die vorherige Abfrage verwenden, um alle erforderlichen Daten abzurufen, und dann im Falle doppelter CUSTOMER_IDs eine zweite Abfrage durchführen, um Konflikte zu lösen?
Ich lerne ein grundlegendes maschinelles Lernen für Klassifizierungszwecke. Ich habe ein logistisches Regressionsmodell auf einem Kundenbahnen-Datensatz von Kaggle ( trainiert. Ich habe jedoch einen...
Ich habe den FreeSwitch-Client von heruntergeladen, und ich konnte es ohne Fehler mit Java 17 erstellen. Ich erhalte jedoch jedes Mal, wenn ich versuche, auszuführen sendbackgroundAPICommand () ....
Ich habe den FreeSwitch-Client von heruntergeladen, und ich konnte es ohne Fehler mit Java 17 erstellen. Ich erhalte jedoch jedes Mal, wenn ich versuche, auszuführen sendbackgroundAPICommand () ....
hi im Reinigen einer Reihe von E-Mails und benötigt Hilfe beim Entfernen von Daten in jeder Zelle. In meinem Datenrahmen möchte ich die doppelten Werte in jedem Wert in jeder Zelle mit mehreren...