Selezione utente con più breve tempo e unendosi con altri dati
-
20-09-2019 - |
Domanda
Ho un database Oracle in cui sto cercando di selezionare un campo user
fin dalla più tenera fila (sulla base di un campo time
) qualora siano soddisfatte determinate condizioni, e non so come farlo. Ecco il succo della mia domanda:
SELECT id,
CASE WHEN value = 'xyz'
THEN 'Pending'
ELSE 'Not Pending'
END AS status,
time
FROM table1
INNER JOIN ...
WHERE subject IN (...) AND
field = 'Status'
Il mio problema è che non so come selezionare user
e ottenere solo il valore dalla riga con il valore time
primo corrispondere le condizioni in cui. Non credo che posso usare HAVING
visto che non sto facendo alcuna funzione di aggregazione nella mia SELECT. La condizione 'primo valore time
' ha bisogno di applicare solo per la selezione del campo user
, vale a dire che voglio id
e value
per essere selezionati per tutti i valori di del campo time
.
stavo pensando che potrei mantenere l'istruzione SELECT che ho sopra e poi unirsi con un'altra istruzione SELECT che ottiene il user
particolare che voglio.
SELECT id, status, time, user
FROM (
...query above...
),
(
SELECT user
FROM table1
WHERE subject in (...) AND
field = 'Status' AND
ROWNUM = 1
ORDER BY time ASC
)
Tuttavia, questo diventa un solo valore per user
globale, e ci dovrebbe essere un valore separato per ogni user
id
selezionato nella prima query. Come faccio a limitare la mia domanda SELECT user
dal campo id
dell'altro interrogazione? E 'questo anche il giusto approccio per ottenere ciò che voglio?
Soluzione
SELECT id,
CASE WHEN value = 'xyz'
THEN 'Pending'
ELSE 'Not Pending'
END AS status,
time,
FIRST_VALUE(user) OVER (PARTITION BY id ORDER BY time) AS first_user
FROM table1
INNER JOIN
...
WHERE subject IN (...) AND
field = 'Status'