Pregunta

necesito ayuda con una consulta - Estoy usando Firebird 2.1

.

Tengo una tabla 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

Me gustaría llegar las duraciones de cada ActivityID pero si hay más de un entradas disponibles con la misma ActivityID, necesito el conseguir el que tiene el valor más alto BilledAt. (La entrada más reciente)

Si ejecuto:

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

voy a conseguir lo que quiero sin los valores de duración. Si incluyo la columna Duración en la cláusula GROUP BY, se seleccionan entonces múltiples ActivityIDs.

¿Hay una solución elegante a este?

Gracias!

¿Fue útil?

Solución

No está familiarizado con el pájaro de fuego lo que la sintaxis podría estar equivocado, pero esto debería 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 se puede utilizar una más intuitiva DONDE NO EXISTE subconsulta en lugar de la LEFT JOIN, pero creo que los objetivos arriba mencionados a ser más rápido.

Otros consejos

Me gustaría hacer como esto

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top