PL / SQL pour sélectionner une fenêtre de partage de données
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.
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.