2010-05-20 6 views
1

Excusez-moi pour avoir posté une question similaire. S'il vous plaît considérez ceci:Sélectionnez une ligne ayant une colonne avec la valeur maximale - Sur une plage de dates

date     value 

18/5/2010, 1 pm  40 
18/5/2010, 2 pm  20 
18/5/2010, 3 pm  60 
18/5/2010, 4 pm  30 
18/5/2010, 5 pm  60 
18/5/2010, 6 pm  25 
19/5/2010, 6 pm  300 
19/5/2010, 6 pm  450 
19/5/2010, 6 pm  375 
20/5/2010, 6 pm  250 
20/5/2010, 6 pm  310 

La requête est d'obtenir la date et la valeur pour chaque jour de telle sorte que la valeur obtenue pour ce jour-là est max. Si la valeur maximale est répétée ce jour-là, l'horodatage le plus bas est sélectionné. Le résultat devrait être comme:

18/5/2010, 3 pm  60 
19/5/2010, 6 pm  450 
20/5/2010, 6 pm  310 

La requête devrait prendre dans une plage de dates comme celle donnée ci-dessous et trouver des résultats pour cette gamme de la façon ci-dessus:

où date> = to_date ('26/03/2010' , 'DD/MM/AAAA) ET Date < to_date ('27/03/2010' ,' DD/MM/YYYY)

Répondre

2

Si vous fournissez une commande CREATE TABLE et INSERT, il est beaucoup plus facile de fournir une réponse testée.

create table i (i_dt date, i_val number); 

insert into i values (to_date('18/5/2010 1pm','dd/mm/yyyy hham'),  40); 
insert into i values (to_date('18/5/2010 2pm','dd/mm/yyyy hham'),  20); 
insert into i values (to_date('18/5/2010 3pm','dd/mm/yyyy hham'),  60); 
insert into i values (to_date('18/5/2010 4pm','dd/mm/yyyy hham'),  30); 
insert into i values (to_date('18/5/2010 5pm','dd/mm/yyyy hham'),  60); 
insert into i values (to_date('18/5/2010 6pm','dd/mm/yyyy hham'),  25); 
insert into i values (to_date('19/5/2010 6pm','dd/mm/yyyy hham'),  300); 
insert into i values (to_date('19/5/2010 6pm','dd/mm/yyyy hham'),  450); 
insert into i values (to_date('19/5/2010 6pm','dd/mm/yyyy hham'),  375); 
insert into i values (to_date('20/5/2010 6pm','dd/mm/yyyy hham'),  250); 
insert into i values (to_date('20/5/2010 6pm','dd/mm/yyyy hham'),  310); 

select i_dt, i_val from 
    (select i.*, rank() over (partition by trunc(i_dt) order by i_val desc, i_dt asc) rn 
    from i) 
where rn = 1; 
0

Je n'ai pas essayé, mais je pense que vous voulez quelque chose comme:

select max(date) 
from table 
where date >= to_date('26/03/2010','DD/MM/YYYY') AND date < to_date('27/03/2010','DD/MM/YYYY') 
group by trunc(date) 
+0

Merci pour la réponse. Mais, lorsque j'utilise cette requête pour la plage de dates ayant plus de 1 jour: où date> = to_date ('18/03/2010 ',' JJ/MM/AAAA ') ET date Abhishek

2

Vous agrégationz vos données, utilisez donc les fonctions de regroupement et d'agrégation. Vous pouvez ajouter n'importe quelle clause where, mais j'ai copié votre clause where, en changeant les dates pour que chaque enregistrement soit sélectionné. Empruntant créer table et insérer les déclarations de Gary:

SQL> select min(i_dt) keep (dense_rank last order by i_val) i_dt 
    2  , max(i_val) i_val 
    3 from i 
    4 where i_dt >= to_date('26/03/2010','dd/mm/yyyy') 
    5  and i_dt < to_date('27/05/2010','dd/mm/yyyy') 
    6 group by trunc(i_dt) 
    7/

I_DT      I_VAL 
------------------- ---------- 
18-05-2010 15:00:00   60 
19-05-2010 18:00:00  450 
20-05-2010 18:00:00  310 

3 rows selected. 

Cordialement, Rob .

+0

Merci. Comment changer cette requête pour obtenir ceci: 18-05-2010 15:00:00 60 18-05-2010 17:00:00 60 19-05-2010 18:00:00 450 20- 05-2010 18:00:00 310 – Abhishek

+1

Pouvez-vous s'il vous plaît modifier votre question ou en commencer une nouvelle, et inclure une explication avec votre nouvelle sortie. Parce que ce commentaire me déroute. –

Questions connexes