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!

È stato utile?

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top