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?

¿Fue útil?

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'
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top