Prenons l'exemple minimal suivant:
KEY1 KEY2 KEY3 HOUR ---------- ---------- ---------- ----- 27 993334444 1 23:00 26 992296089 1504 12:30
Je voudrais exclure l'enregistrement où KEY3 est 1275, car son HOUR est supérieur à celui de l'enregistrement où KEY3 est 1504.
J'ai essayé ce qui suit, mais sans succès (je m'attendais à ce que KEY4 soit 1504):
SQL> select * from teste_jm; KEY1 KEY2 KEY3 HOUR ---------- ---------- ---------- ----- 27 993334444 1 23:00 27 993334444 2 23:59 26 992296089 1504 12:30 26 992296089 1275 13:30
Donc, essentiellement, ce que j'aimerais faire, dans Oracle 11g, consiste à ne conserver que les enregistrements dont l'heure est la plus ancienne , pour la même paire KEY1, KEY2.
Comment procéder?
EDIT: Voici un exemple plus complet:
SQL> select key1, key2, key3, hour, min(key3) over (partition by key1, key2, key3 order by to_date(hour, 'HH24:MI')) key4 from teste_jm; KEY1 KEY2 KEY3 HOUR KEY4 ---------- ---------- ---------- ----- ---------- 26 992296089 1275 13:30 1275 26 992296089 1504 12:30 1504
Sortie souhaitée pour ce qui précède:
SQL> select key1, key2, key3, hour from teste_jm; KEY1 KEY2 KEY3 HOUR ---------- ---------- ---------- ----- 26 992296089 1504 12:30 26 992296089 1275 13:30
SQLFiddle contenant les exemples de données ici .
3 Réponses :
essayez de faire ceci
select key1, key2, key3, min(hour) OVER (PARTITION BY key1,key2) from teste_jm;
Euh, après votre modification, essayez ceci
select key1, key2, key3, hour from teste_jm where hour = (select min(hour) from teste_jm);
Désolé, mais cela ne produit pas le résultat souhaité; voir «l'exemple plus complet» ci-dessus, où je veux que 2 enregistrements soient renvoyés. Je m'excuse de ne pas être plus clair plus tôt.
Hmm, votre deuxième réponse est ... Un peu proche? Je veux en fait sélectionner une sorte de MIN (KEY3) au lieu de MIN (HOUR) ... Sauf ... Afin de décider quelle est la valeur minimale, je veux que la colonne HOUR soit utilisée. J'espère que cela a du sens.
Il suffit d'avoir une condition pour avoir une clause car ces clés d'heure min vérifient ma réponse
Pourquoi ne pas simplement grouper et obtenir le min et j'espère que l'exemple d'entrée vs o / p ci-dessus est correct afin de se synchroniser avec la requête ci-dessous
Select KEY1, KEY2 ,min(KEY3), HOUR from table group by KEY1, KEY2 having HOUR=min(HOUR)
Cela donne ... ORA-00979: pas une expression GROUP BY
vérifiez maintenant que cela devrait fonctionner. Je viens de voir qu'il y avait plusieurs key3 qui fonctionnent
Ça ne marche toujours pas. Pas une expression GROUP BY. J'ai ajouté un lien SQLFiddle à mon message d'origine afin que vous puissiez vérifier.
Vous êtes proche mais vous avez besoin d'une sous-requête à filtrer et de la bonne logique pour le minimum:
select key1, key2, key3, hour from (select key1, key2, key3, hour, min(to_date(hour, 'HH24:MI')) over (partition by key1) as min_hour from teste_jm ) t where hour = min_hour;
Semble fonctionner, merci. Juste une petite correction: "heure" est une colonne VARCHAR2 (5) au format HH24: MI; par conséquent, la sous-requête doit contenir to_date (hour, 'HH24: MI')
et min (to_date (hour, 'HH24: MI'))
au lieu de hour
et min (heure)
respectivement. À part cela, votre réponse semble correcte.