Selección de usuario con brevedad y unirse con otros datos
-
20-09-2019 - |
Pregunta
Tengo una base de datos Oracle, donde estoy tratando de seleccionar un campo user
desde la primera fila (basado en un campo time
) cuando se cumplan ciertas condiciones, y no sé cómo hacerlo. Aquí está la esencia de mi consulta:
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'
Mi problema es que no sé cómo seleccionar user
y obtener sólo el valor de la fila con el valor más antiguo time
equiparar las condiciones de dónde. No creo que pueda usar HAVING
ya que no estoy haciendo ninguna función de agregado en mi SELECT. La condición de 'primer valor time
' tiene que aplicar solamente para la selección del campo user
, es decir, quiero id
y value
a ser seleccionadas para todos valores del campo time
.
Yo estaba pensando que podía mantener la instrucción SELECT que tengo arriba y luego unirse con otra instrucción SELECT que obtiene el user
particular, quiero.
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
)
Sin embargo, esto sólo se pone un valor para user
general, y debe haber un valor user
separado para cada id
seleccionados en la primera consulta. ¿Cómo limito mi consulta SELECT user
por el campo id
de la otra consulta? ¿Es esto el enfoque correcto para conseguir lo que quiero?
Solución
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'