Pergunta

Preciso de ajuda com uma consulta - estou usando o Firebird 2.1.

Eu tenho uma mesa como:

RowID (primary key) | ActivityID | Duration | BilledAt

1 | 1 | 50 | 06.08.2010, 14:05:00.598
2 | 1 | 70 | 06.08.2010, 14:05:00.608
3 | 2 | 30 | 06.08.2010, 14:05:00.598
4 | 3 | 40 | 06.08.2010, 14:05:00.598
5 | 3 | 50 | 06.08.2010, 14:05:00.608

Gostaria de obter as durações para cada atividade, mas se houver mais de uma entradas disponíveis com o mesmo ActivityID, preciso do obtenção daquele com o maior valor de Billedat. (a entrada mais recente)

Se eu executar:

SELECT ActivityID, Max(BilledAt) 
FROM BilledTime 
GROUP BY ActivityID;

Vou obter o que quero sem os valores de duração. Se eu incluir a coluna de duração no grupo por cláusula, vários ATIVILIDADES serão selecionados.

Existe uma solução elegante para isso?

Obrigado!

Foi útil?

Solução

Não familiarizado com o Firebird, então a sintaxe pode estar errada, mas isso deve funcionar:

SELECT a.ActivityID, a.Duration, a.BilledAt
FROM BilledTime a
LEFT JOIN BilledTime b on a.ActivityID = b.ActivityID AND b.BilledAt > a.BilledAt
WHERE b.ActivityID IS NULL

Como alternativa, você pode usar um mais intuitivo, onde não existe subconstração em vez da junção esquerda, mas acredito que o exposto acima acaba sendo mais rápido.

Outras dicas

Eu faria assim

SELECT a.ActivityID, a.Duration, a.BilledAt 
FROM BilledTime a 
WHERE a.BilledAt = (select max(b.billedAt) from BilledTime b where b.ActivityId = a.ActivityID)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top