Il y a deux raisons pour lesquelles row y
n'est pas retourné est dû à la condition :
b.start > a.start
signifie qu'une ligne ne se joindra jamais à elle-même- GROUP BY renverra un seul enregistrement par
APP_nm
valeur, mais toutes les lignes ont la même valeur.
Cependant, il existe d'autres erreurs de logique dans la requête qui ne seront pas gérées correctement. Par exemple, comment sait-il quand une "nouvelle" session commence ?
La logique que vous recherchez peut être obtenue dans PostgreSQL normal à l'aide d'un DISTINCT ON
fonction, qui affiche une ligne par valeur d'entrée dans une colonne spécifique. Cependant, DISTINCT ON
n'est pas pris en charge par Redshift.
Quelques solutions de contournement potentielles :DISTINCT ON comme fonctionnalité pour Redshift
La sortie que vous recherchez serait triviale en utilisant un langage de programmation (qui peut parcourir les résultats et stocker des variables) mais est difficile à appliquer à une requête SQL (qui est conçue pour fonctionner sur des lignes de résultats). Je recommanderais d'extraire les données et de les exécuter via un script simple (par exemple en Python) qui pourrait ensuite générer les combinaisons de début et de fin que vous recherchez.
Il s'agit d'un excellent cas d'utilisation pour une Fonction Hadoop Streaming , que j'ai mis en œuvre avec succès dans le passé. Il prendrait les enregistrements en entrée, puis "se souviendrait" de l'heure de début et ne produirait un enregistrement que lorsque la logique de fin souhaitée a été respectée.