PL/SQL para selecionar uma janela de dados de partição
Pergunta
Trabalhando com o Oracle 11g aqui.
Estou tentando descobrir como escrever uma consulta específica contra uma tabela de amostra abaixo:
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
Aqui está o pseudo-pl/sql do que eu quero que a consulta faça:
SELECT ID, TYPE
FROM DATA_TABLE
WHERE ROWNUM = 1 AND STATUS = 'NEW'
GROUP BY ID, TYPE
ORDER BY PRIORITY, DATE
Quero pegar o próximo grupo de ID, tipo que tem um status novo ordenado por prioridade e data.
No caso acima, a declaração deve retornar qualquer 1 Q ou 3 Q, mas não ambos, pois eles têm a mesma prioridade e data. Se 3 q foi definido como status = 'feito', a consulta deve retornar 1 Q.
Para a segunda etapa, vou juntar esses dados à tabela para pegar as linhas para o conjunto que quero processar (por exemplo: 1 Q). Este não precisa ser um processo de duas etapas; Se eu puder pegar o conjunto de linhas para processar sem a junção que seria ideal.
Espero estar perdendo algo muito simples, mas estou aberto a usar funções analíticas para particionar, se necessário.
Solução
SELECT * FROM (SELECT ID, TYPE FROM DATA_TABLE WHERE STATUS = 'NEW' ORDER BY PRIORITY, DATE) WHERE ROWNUM = 1
Isso deve trabalhar. Você não deseja agrupar por ID e digitar, porque não está realmente tentando executar nenhum tipo de agregação nas linhas que correspondam a um determinado ID e tipo. Se você se importasse apenas com uma coluna (por exemplo, data), você poderia dizer
SELECT ID, TYPE FROM DATA_TABLE WHERE DATE = (SELECT MIN(DATE) FROM DATA_TABLE) AND ROWNUM = 1
E evite classificar a tabela inteira. Mas não vejo como fazer isso funcionar aqui.