Question

Travailler avec Oracle 11g ici.

Je suis en train de comprendre comment écrire une requête spécifique contre une table exemple ci-dessous:

 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

Voici le pseudo-PL / SQL de ce que je veux la requête à faire:

 SELECT ID, TYPE
 FROM DATA_TABLE
 WHERE ROWNUM = 1 AND STATUS = 'NEW'
 GROUP BY ID, TYPE
 ORDER BY PRIORITY, DATE

Je veux saisir le prochain groupe d'ID, type qui a un statut NEW ordonné par priorité et la date.

Dans le cas ci-dessus la déclaration doit retourner soit 1 Q ou 3 Q, mais pas les deux, car ils ont la même priorité et la date. Si 3 Q a été réglé sur STATUS = 'DONE', la requête doit retourner 1 Q.

Pour la deuxième étape, je vais joindre ces données de retour dans la table pour saisir les lignes pour l'ensemble je veux traiter (par exemple: 1 Q). Cela ne doit pas être un processus en deux étapes; si je peux saisir l'ensemble des lignes à traiter sans se joindre à ce serait l'idéal.

J'espère que je manque juste quelque chose de vraiment simple, mais je suis ouvert à l'aide de fonctions analytiques pour le partitionnement si besoin est.

Était-ce utile?

La solution

SELECT * FROM (SELECT ID, TYPE FROM DATA_TABLE WHERE STATUS = 'NEW' ORDER BY PRIORITY, DATE) WHERE ROWNUM = 1

Cela devrait fonctionner. Vous ne voulez pas le groupe par ID et TYPE parce que vous essayez pas vraiment d'effectuer toute sorte d'agrégation sur les lignes correspondant à un ID et type donné. Si vous n'inquiétiez une colonne (disons DATE), vous pouvez dire

SELECT ID, TYPE FROM DATA_TABLE WHERE DATE = (SELECT MIN(DATE) FROM DATA_TABLE) AND ROWNUM = 1

et éviter le tri de la table entière. Mais je ne vois pas comment faire ce travail ici.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top