Ayuda con consulta SQL - un poco de magia necesaria
-
26-09-2019 - |
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!
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)