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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top