Ci sono due ragioni per cui row y
non viene restituito è dovuto alla condizione:
b.start > a.start
significa che una riga non si unirà mai a se stessa- Il GROUP BY restituirà un solo record per
APP_nm
value, ma tutte le righe hanno lo stesso valore.
Tuttavia, nella query sono presenti ulteriori errori logici che non verranno gestiti correttamente. Ad esempio, come fa a sapere quando inizia una "nuova" sessione?
La logica che cerchi può essere raggiunta nel normale PostgreSQL con l'aiuto di un DISTINCT ON
funzione, che mostra una riga per valore di input in una colonna specifica. Tuttavia, DISTINCT ON
non è supportato da Redshift.
Alcune potenziali soluzioni alternative:DISTINCT ON come funzionalità per Redshift
L'output che cerchi sarebbe banale usando un linguaggio di programmazione (che può scorrere i risultati e memorizzare variabili) ma è difficile da applicare a una query SQL (che è progettata per operare su righe di risultati). Consiglierei di estrarre i dati ed eseguirli tramite un semplice script (ad esempio in Python) che potrebbe quindi restituire le combinazioni di inizio e fine che cerchi.
Questo è un eccellente caso d'uso per una funzione Hadoop Streaming , che ho implementato con successo in passato. Prenderebbe i record come input, quindi "ricorderebbe" l'ora di inizio e produrrebbe un record solo quando la logica finale desiderata è stata soddisfatta.