Aiuto con query SQL - qualche magia necessaria
-
26-09-2019 - |
Domanda
Ho bisogno di aiuto con una query - sto usando Firebird 2.1
.Ho una tabella del tipo:
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
Mi piacerebbe ottenere le durate per ogni ActivityID ma se ci sono più di una le voci disponibili con la stessa ActivityID, ho bisogno di ottenere quella con il più alto valore BilledAt. (La voce più recente)
Se eseguo:
SELECT ActivityID, Max(BilledAt)
FROM BilledTime
GROUP BY ActivityID;
I otterrà quello che voglio senza i valori di durata. Se includo colonna Durata nella clausola GROUP BY, vengono selezionate quindi più ActivityIDs.
C'è una soluzione elegante a questo?
Grazie!
Soluzione
Non hanno familiarità con Firebird così la sintassi potrebbe essere sbagliato, ma questo dovrebbe funzionare:
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
In alternativa è possibile utilizzare una più intuitiva DOVE NON ESISTE sottointerrogazione al posto del LEFT JOIN, ma credo che le estremità di cui sopra per essere più veloce.
Altri suggerimenti
Vorrei fare come questo
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)