Rimuovi voci duplicate da SQLQuery in base alla dataCiao,
Ho provato a usare questo video linkato qui sotto per usare la funzione SQLQuery. Tuttavia, ho un problema.
community.jmp.com/t5/video/gallerypage/video-id/tvcW9lZTE6Ie3IFXxeru0AYNqvj5AB5r
Problema: prendi la Tabella 2 con "cilindro", "Data_ricevuta" e "lotto" e uniscila alla Tabella 1 che ha "lotto", "cilindro" e "Data_lotto"
Devo trovare una corrispondenza esatta con "Cilindro" e poi prendere la "Data di ricezione" più vicina alla "Data del lotto" (Data_lotto >= Data_ricevuta).
Ho creato la query e ho anche eseguito il passaggio per creare un tag numerico che dovrebbe teoricamente fornire solo 1 numero di lotto univoco per ogni batch (non mostrato nella tabella seguente)
Tuttavia, questo è ciò che sto ottenendo
| Lotto | Data del lotto | Numero del cilindro | Numero di lotto | Data di ricezione |
| 1 | 13/02/2023 | 55 | A | 14/06/2022 |
| 1 | 13/02/2023 | 55 | B | 21/10/2022 |
| 1 | 13/02/2023 | 55 | C | 30/11/2022 |
Dovrebbe essere popolata solo 1 riga dalla query (dovrebbe essere l'ultima riga 30/11/2022); le altre sono "fantasma" poiché abbiamo creato solo 1 "Batch 1"
Qualche aiuto su come migliorare il codice SQL per evitare voci duplicate e selezionare la voce solo se la data di ricezione è la più vicina <= data batch?
Questo era il codice dell'interfaccia SQLQuery che è stato fornito
SELEZIONA DISTINTO t1.Batch, t1.Batch_Date AS Data, t1.Cylinder_Number,
t2.Lot_Number, t2.Cylinder_Number AS "Numero_Cilindro 2", t2.Lot_Date AS "Data 2", MIN(t2."Batch Num") AS "Numero lotto minimo"
DA "Tabella 1" t1
JOIN ESTERNO SINISTRO "Tabella 2" t2
ON ( ( t1.Numero_cilindro = t2.Numero_cilindro ) E ( t1.Data_Cat >= t2.Data_Lotto ) )
RAGGRUPPAMENTO PER t1.Batch, t1.Data_Batch, t1.Numero_cilindro,
t2.Numero_Lotto, t2.Numero_Cilindro, t2.Data_Lotto;
Automazione e scriptingRe: Rimuovi voci duplicate da SQLQuery in base alla dataSono queste le tabelle JMP su cui stai eseguendo la query SQL? Puoi condividere le tabelle?
Re: Rimuovi voci duplicate da SQLQuery in base alla dataEcco i file. Mi dispiace, volevo allegarli.
La Tabella 1-1 e la Tabella 2-2 sono come descritto sopra.
I risultati della query mostrano la tabella finale in cui sono presenti più voci per ogni batch (ma dovrebbe esserci solo 1 voce per batch, come descritto sopra).
Re: Rimuovi voci duplicate da SQLQuery in base alla dataHo appena risposto al thread principale con i file, grazie per avermi contattato
Re: Rimuovi voci duplicate da SQLQuery in base alla dataQuesto è abbastanza vicino al limite di ciò che proverei a fare con le limitate capacità SQL di JMP (almeno quando si usano tabelle di dati). È molto probabilmente più semplice usare SQL + JSL
Names Default To Here(1);
res = New SQL Query(
Version(130),
Connection("JMP"),
JMP Tables(
["t1" => "$DOWNLOADS\Table1-1.jmp",
"t2" => "$DOWNLOADS\Table 2-2.jmp"]
),
QueryName("SQLQuery2"),
CustomSQL(
"\[SELECT
t1.Cylinder,
t1.Batch,
t1."Batch Date",
t2."Received Date",
t2.Supplier,
t2.Lot
FROM t1
LEFT OUTER JOIN t2 ON
t1.Cylinder = t2.Cylinder
AND t1."Batch Date" >= t2."Received Date"
]\")
) << Run;
res << select where(Row() == Col Max(Row(), :Cylinder, :Batch) | Is Missing(:Lot));
res << Invert Row Selection;
res << delete rows;Re: Rimuovi voci duplicate da SQLQuery in base alla dataCiao, grazie per l'aiuto rapido! Ho provato la macro e sfortunatamente per alcuni elementi mantiene la data più vecchia possibile. Sembra che non lo faccia per tutte le voci (vedi l'ultima riga della tabella qui sotto).
Si tratta quindi di un netto miglioramento: non ci sono più righe per lo stesso lotto, ma non viene sempre estratto il lotto/la data di ricezione corretti per il lotto in questione.
Esempio
| Cilindro | Lotto | Data del lotto | Data di ricezione | Fornitore | Quantità | | Dovrebbe essere ricevuto in data |
| 8 | 2273 | 8/9/2023 | 20/05/2022 | B | 55 | | 22/06/2023 |
| 3 | 2274 | 8/10/2023 | 20/05/2022 | B | 55 | | 22/06/2023 |
| 2 | 2275 | 8/11/2023 | 20/05/2022 | B | 55 | | 22/06/2023 |
| 10 | 2276 | 8/12/2023 | 20/05/2022 | B | 55 | | 22/06/2023 |
| 6 | 2277 | 8/12/2023 | 20/05/2022 | B | 55 | | 22/06/2023 |
| 9 | 2278 | 13/08/2023 | 20/05/2022 | B | 55 | | 22/06/2023 |
| 1 | 2279 | 14/08/2023 | 20/05/2022 | B | 55 | | 22/06/2023 |
| 212 | 2280 | 15/08/2023 | 22/06/2023 | B | 74 | | (il file è corretto) |
Re: Rimuovi voci duplicate da SQLQuery in base alla dataNon so bene come leggere la tua tabella. Se do un'occhiata alla Tabella 2-2 c'è solo 1 riga per il Cilindro 1 che ha la data di ricezione 20/05/2022

Re: Rimuovi voci duplicate da SQLQuery in base alla dataCiao, rispondo per mantenere attivo l'argomento. Penso che si sia verificato qualcosa quando ho aggiornato il mio file per rimuovere le informazioni proprietarie. Ci darò un'occhiata più approfondita domani e ti risponderò.
Re: Rimuovi voci duplicate da SQLQuery in base alla dataGrazie per questa assistenza! Mi sono accorto che c'era un errore nel mio set di dati originale (l'ho modificato per l'inserimento su questo sito web per rendere anonimi i dati). Questo codice ha funzionato bene, ti contatterò per qualsiasi altra domanda.Re: Rimuovi voci duplicate da SQLQuery in base alla dataUn'ultima domanda: come posso aggiungere altre colonne estratte dalla Tabella 2 nella tabella della query finale, anche se non le utilizzo come criterio di corrispondenza?
Ho provato ad aggiungere nel tuo codice sopra una colonna t2."wt%" ma ora il codice mi dà un errore. Ho altre colonne che vorrei estrarre contemporaneamente (circa 10 colonne in totale) ma non so come fare senza ottenere un errore.
Grazie!
Re: Rimuovi voci duplicate da SQLQuery in base alla dataQuale errore ricevi?
Dovrebbero andare nella parte Custom SQL() (l'ho provato e ha funzionato benissimo con t2."wt%")
CustomSQL(
"\[SELECT
t1.Cylinder,
t1.Batch,
t1."Batch Date",
t2."Received Date",
t2.Supplier,
t2.Lot,
t2."wt%"
FROM t1
LEFT OUTER JOIN t2 ON
t1.Cylinder = t2.Cylinder
AND t1."Batch Date" >= t2."Received Date"
]\")
Se vuoi tutte le colonne da t2, penso che SQL JMP stia utilizzando supporti t2.*