1
votes

Oracle 11g - Exclut les enregistrements de l'ensemble où la colonne des heures est supérieure à

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 .


0 commentaires

3 Réponses :


-1
votes

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);


3 commentaires

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



0
votes

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)


3 commentaires

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.



1
votes

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;


1 commentaires

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.