选择一列有最大值的行 - 在日期范围内

问题描述:

不好意思发表类似的问题。请考虑一下:选择一列有最大值的行 - 在日期范围内

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 

查询是每天得到日期和值,使得这一天的到来,得到的值为最大。如果当天重复最大值,则选择最低时间戳。结果应该是这样的:

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

查询应采取在一个时间范围像下面给出的一个并且发现结果为在该范围以上述方式:

其中 日期> = TO_DATE('26/03/2010','DD/MM/YYYY')和 date < to_date('27/03/2010','DD/MM/YYYY')

如果您提供了CREATE TABLE和INSERT,它使得提供经过测试的答案变得更容易。

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; 

我还没试过这个,认为你想要的东西是这样的:

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

感谢您的回复。但是,当我使用此查询的日期范围超过1天时: 其中date> = to_date('18/03/2010','DD/MM/YYYY')和日期 Abhishek 2010-05-20 04:38:03

您正在汇总您的数据,因此请使用分组和汇总功能。你可以添加任何你想要的where子句,但我复制了你的where子句,改变日期以便选择每个记录。借用加里的create table和insert语句:

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. 

问候, 罗布。

+0

谢谢。我如何更改此查询以获取此: 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 2010-05-21 04:53:09

+1

你可以编辑你的问题或开始一个新的问题,并包括你的新输出的解释。因为这个评论混淆了我。 – 2010-05-21 06:37:57