Costruttore di query - Record univoci<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ciao ,
Dopo un bel po' di difficoltà personali per risolvere il mio problema, ho deciso di postarlo come domanda per gli utenti e la comunità di JMP.
Avere un database da cui vengono estratti p1, p2, asset e time. Il database è un database di accumulo, il che significa che i parametri p1 e p2 vengono caricati come rappresentanti dell'ultimo stato per ciascuno risorsa in uno specifico tempo . In altre parole, le precedenti istanze precedenti di p1 e p2 non sono valide e le versioni più recenti di p1 e p2 sono necessarie per un dato risorsa al più tardi segnalato tempo .
Quindi, ciò di cui ho bisogno è un ordine decrescente via tempo e quindi forzare il risultato a essere unico a risorsa livello.
Qualche idea su come devo dirigere questo nel generatore di query?
Preferisco piuttosto avere una soluzione non utilizzando un SQL personalizzato .... In realtà ho una soluzione su Custom SQL, ma mi piace imparare come farlo all'interno del generatore di query poiché aggiungerò alcuni altri pezzi che saranno difficili da fare in Custom SQL
Apprezzo l'aiuto.
Altug Bayram
Ri: Costruttore di query - Record univociQuesto è un vecchio post, ma qui va:
@altug_bayram ha scritto:
dimenticavo di aggiungere...
Il motivo per cui non sono riuscito a far funzionare la tua query in origine è che non mi riferivo al database nel modo corretto. Una volta fatto, ha funzionato
Qual era il modo corretto? Ricevo anche un errore che dice "ERRORE: la relazione" database_enzima_db "non esiste; Errore durante la preparazione dei parametri [SQLSTATE=42P01]" e non sono sicuro di come risolverlo
Ri: Costruttore di query - Record univociPiacere mio.Questo thread ha davvero spinto la mia comprensione delle sottoquery.Ho imparato molto.
Occuparsi,
Eric
Ri: Costruttore di query - Record univociEric,
Capisco meglio ora e sono d'accordo con te. Ancora una volta, grazie per lo sforzo che hai fornito a questo problema.
Il tuo aiuto è stato molto prezioso.
Ri: Costruttore di query - Record univociÈ possibile eseguire la versione originale solo con Time e utilizzare l'aggregazione MAX su X per restituire le righe corrette, ma non sarà possibile scoprire i valori di p1 e p2 per tali righe.Se faccio quello che hai detto lasciando p1 e p2 nella query ottengo tutte le righe con i tempi massimi duplicati, perché p1 e p2 diventano GROUP BY per la query:

Ora, se tolgo p1 e p2 dalla query, la query restituisce le righe corrette:

ma il punto era trovare i valori di p1 e p2 per quelle righe, e non ci sono più.Quindi penso che l'approccio della doppia sottoquery sia l'unico approccio che risponda alla domanda che hai posto.
Eric
Ri: Costruttore di query - Record univociEric,
Ha funzionato come un fascino ...
Mi chiedo però ... avrebbe funzionato anche eseguendo la prima versione originale di epxression personalizzata (con solo Time) E scegliendo l'aggregazione X come "Massimo" all'interno del campo "Colonne incluse" ...?
grazie mille ....
Ri: Costruttore di query - Record univociDISTINCT non aiuterà l'OP, perché qui non ci sono davvero righe distinte.
Ho trovato una query che avrebbe risolto il secondo caso.Ho aggiunto 6 righe in basso che duplicano i tempi massimi per ogni risorsa, oltre ad aver aggiunto una variabile X.Ecco la tabella:

Ed ecco la query che funziona (richiede una sottoquery e una sottoquery all'interno di una sottoquery)):

L'espressione personalizzata è:
t1.Time = (SELECT MAX(tInner.Time) FROM parti tInner WHERE t1.Asset = tInner.Asset)
E
t1.X = (SELECT MAX(tInner.X) FROM parti tInner WHERE t1.Asset = tInner.Asset AND
tInner.Time = (SELECT MAX(tInner2.Time) FROM parti tInner2 WHERE tInner.Asset = tInner2.Asset))
Ho scritto in maiuscolo tutte le parole chiave SQL per facilitarne la lettura.Ho provato alcune query più semplici, ma non hanno funzionato.
HTH,
Eric
Ri: Costruttore di query - Record univociSe si tratta di una voce duplicata, forse l'utilizzo della parola chiave DISTINCT può essere d'aiuto.
Ri: Costruttore di query - Record univocidimenticavo di aggiungere...
Il motivo per cui non sono riuscito a far funzionare la tua query in origine è che non mi riferivo al database nel modo corretto. Una volta fatto, ha funzionato
Ri: Costruttore di query - Record univociEric,
Molte grazie ....
Scusa, ho impiegato un po' di tempo per capirlo con un'altra persona esperta di query di GE.
La tua soluzione (la prima) ha sicuramente funzionato!!! Non ho ancora provato il secondo.
Ho un altro problema -
si scopre che le persone che popolano il database hanno inserito una voce duplicata per alcune risorse alla stessa ultima ora cronologica.. Quindi, per aggirare il problema, ho un'altra colonna intitolata diciamo X . Manualmente sceglierei semplicemente i due con la X più grande. Non volevo convertire da Max(Time) a Max(X) poiché X di per sé potrebbe non essere così affidabile ma sarebbe il fattore di selezione per le voci Time duplicate.
Abbiamo provato a convertire la tua espressione personalizzata originale in una sorta di inclusione di un secondo MAX (su X)... ma non ha funzionato...
Quindi .. cercando di estrarre ogni Asset dove Time è MAX e se più voci selezionando la voce w/ Max(X)
Eventuali suggerimenti
Ri: Costruttore di query - Record univociIl mio esempio originale era per SQL Server, che è un po' più indulgente.Per Oracle, ho dovuto formattare il nome della tabella nella sottoquery come schema.table, inoltre ho dovuto citare i miei nomi di maiuscole e minuscole:
t1."Time" = (seleziona MAX(t2."Time") da SQBTEST. "parti" t2 dove t2."Asset" = t1."Asset")
Prova a cambiare mia_tabella nel tuo primo tentativo di .mia_tabella e vedere se questo aiuta.
Eric
Ri: Costruttore di query - Record univociEhi, altug,
che database stai usando?
Saresti disposto a condividere l'SQL dalla tua query SQL personalizzata che ti dà il risultato che stai cercando?
Grazie,
Eric
Ri: Costruttore di query - Record univociCiao Eric,
Innanzitutto grazie per l'aiuto....
La tua comprensione è corretta. Sto solo cercando di estrarre una singola riga per ogni risorsa in cui il tempo è massimo (o più recente).
Ho applicato le tue formule. Tuttavia, mi sta dando un errore.
L'ho applicato prima come vero nome della tabella e poi come "t1"
t1.calendar_month = (seleziona MAX(calendar_month) da my_table t2 dove t1.engine_serial_num = t2.engine_serial_num)
t1.calendar_month = (seleziona MAX(calendar_month) da t1 t2 dove t1.engine_serial_num = t2.engine_serial_num)
ERRORE: la relazione "my_table" non esiste.
ERRORE durante l'esecuzione della query [ SQLSTATE: 42P01 ]
Ri: Costruttore di query - Record univociEhi, altug,
Ecco una tabella che credo assomigli a ciò che stai descrivendo (ma supponi che sia in un database anziché in JMP):

La mia comprensione è che vorresti recuperare una riga per A1, A2, A3 e A4 per i quali Time è il massimo.È corretto?
Non credo che sia possibile senza fare una sottoquery che utilizza la funzione MAX, cosa che puoi fare usando un filtro Espressione personalizzata.Ecco la query che ho finito con:

Nel caso in cui sia troppo piccola per essere letta, l'espressione personalizzata è:
t1.Time = (seleziona MAX(Time) dalle parti t2 dove t1.Asset = t2.Asset)
Quindi passi il valore di Asset dalla query principale (t1.Asset) e selezioni le righe che hanno il valore Time massimo per quell'asset.
Fammi sapere se questo aiuta.
Eric
Ri: Costruttore di query - Record univociConto
Grazie per la rapida risposta.
Tuttavia, a meno che non manchi una cosa critica qui, questo non risolve il mio problema.
1) L'ultimo punto valido di qualsiasi risorsa in genere non si trova nello stesso punto temporale, sono piuttosto diversi. Possono avere anni di differenza.
2) Non sto cercando una soluzione rapida se possibile. Ho bisogno che sia completamente automatizzato.
3) Non sono davvero sicuro di come "Filtra per" con >= possa renderlo unico. Penso che tu intendessi piuttosto filtrare per "="
Quindi ho bisogno di un approccio che raccolga l'ultima voce cronologica per qualsiasi risorsa senza dover specificare un filtro temporale (perché i dati più recenti possono essere ovunque nel tempo).
Grazie.
Ri: Costruttore di query - Record univociCiao Altug,
Si prega di vedere l'immagine qui sotto per ottenere un ordine decrescente per tempo.
Fai clic con il pulsante destro del mouse sulla variabile del tempo in Colonne disponibili e seleziona "Ordina per" verrà visualizzata una nuova finestra di dialogo in basso a destra.Da lì puoi selezionare la freccia discendente per ottenere l'ordine temporale desiderato.
È quindi possibile utilizzare un filtro con una richiesta per selezionare un livello di risorsa univoco.
