PL / SQL para seleccionar una ventana de partición de datos
Pregunta
Trabajar con Oracle 11g aquí.
Estoy tratando de encontrar la manera de escribir una consulta específica contra una tabla de ejemplo a continuación:
ID TYPE PRIORITY STATUS DATE
----------------------------------------------------
1 Q A NEW 01-OCT-2009
1 Q A NEW 01-OCT-2009
1 Q A NEW 01-OCT-2009
1 Q A NEW 01-OCT-2009
1 Q A NEW 01-OCT-2009
1 Q A NEW 01-OCT-2009
1 Q A NEW 01-OCT-2009
1 Q A NEW 01-OCT-2009
2 R B NEW 01-OCT-2009
2 R B NEW 01-OCT-2009
2 R B NEW 01-OCT-2009
2 R B NEW 01-OCT-2009
3 R A NEW 01-OCT-2009
3 Q A NEW 01-OCT-2009
3 Q A NEW 01-OCT-2009
Aquí es el pseudo-PL / SQL de lo que quiero hacer la consulta:
SELECT ID, TYPE
FROM DATA_TABLE
WHERE ROWNUM = 1 AND STATUS = 'NEW'
GROUP BY ID, TYPE
ORDER BY PRIORITY, DATE
Quiero agarrar el siguiente grupo de ID, tipo que tiene un estatus NUEVO ordenada por prioridad y la fecha.
En el caso anterior la declaración debe devolver o bien 1 Q o Q 3, pero no ambos, ya que tienen la misma prioridad y la fecha. Si 3 Q se establece en STATUS = 'HECHO' continuación, la consulta debería devolver 1 Q.
Para el segundo paso que voy a unirse a estos datos de nuevo a la mesa para agarrar las filas del conjunto Quiero procesar (por ejemplo: 1 Q). Esto no tiene que ser un proceso de dos pasos; si puedo agarrar el conjunto de filas para procesar sin la unión que sería lo ideal.
Espero Sólo estoy perdiendo algo muy simple, pero estoy abierto a la utilización de funciones analíticas para la partición si es necesario.
Solución
SELECT * FROM (SELECT ID, TYPE FROM DATA_TABLE WHERE STATUS = 'NEW' ORDER BY PRIORITY, DATE) WHERE ROWNUM = 1
Esto se debe trabajar. Usted no desea agrupar por ID y el tipo porque no está realmente tratando de realizar cualquier tipo de agregación en las filas que coinciden con un determinado ID y el tipo. Si sólo se preocupaba por una columna (decir FECHA) se podría decir
SELECT ID, TYPE FROM DATA_TABLE WHERE DATE = (SELECT MIN(DATE) FROM DATA_TABLE) AND ROWNUM = 1
y evitar la clasificación de toda la tabla. Pero no veo cómo hacer que el trabajo aquí.