Existem duas razões pelas quais
row y
não é retornado é devido à condição:b.start > a.start
significa que uma linha nunca se unirá a si mesma- O GROUP BY retornará apenas um registro por
APP_nm
valor, mas todas as linhas têm o mesmo valor.
No entanto, há outros erros lógicos na consulta que não serão tratados com êxito. Por exemplo, como ele sabe quando uma "nova" sessão começa?
A lógica que você procura pode ser obtida no PostgreSQL normal com a ajuda de um
DISTINCT ON
função, que mostra uma linha por valor de entrada em uma coluna específica. No entanto, DISTINCT ON
não é suportado pelo Redshift. Algumas possíveis soluções alternativas:DISTINCT ON como funcionalidade para Redshift
A saída que você procura seria trivial usando uma linguagem de programação (que pode percorrer resultados e armazenar variáveis), mas é difícil de aplicar a uma consulta SQL (que é projetada para operar em linhas de resultados). Eu recomendaria extrair os dados e executá-los por meio de um script simples (por exemplo, em Python) que poderia gerar as combinações de início e fim que você procura.
Este é um excelente caso de uso para uma função Hadoop Streaming , que implementei com sucesso no passado. Ele tomaria os registros como entrada, então 'lembraria' a hora de início e só produziria um registro quando a lógica final desejada fosse atendida.