Sql 选择一行,该行的列在日期范围内具有最大值
请原谅我提出了一个类似的问题。请考虑以下事项:Sql 选择一行,该行的列在日期范围内具有最大值,sql,oracle,Sql,Oracle,请原谅我提出了一个类似的问题。请考虑以下事项: 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
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
查询应采用如下所示的日期范围,并以上述方式查找该范围的结果:
在哪里
日期>=截止日期“2010年3月26日”、“年月日”和
日期<截止日期'27/03/2010','DD/MM/yyyyy'我没有尝试过这个,但我想你想要的是:
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)
我没有试过,但我想你想要的是:
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)
如果提供CREATETABLE和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;
如果提供CREATETABLE和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;
您正在聚合数据,因此请使用分组和聚合函数。您可以添加任何您想要的where子句,但我在中复制了您的where子句,更改了日期以便选中每条记录。借用Gary的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.
问候,,
Rob.您正在聚合数据,因此请使用分组和聚合功能。您可以添加任何您想要的where子句,但我在中复制了您的where子句,更改了日期以便选中每条记录。借用Gary的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.
问候,,
罗布。谢谢你的回复。但是,当我对超过1天的日期范围使用此查询时:其中date>=to_date'18/03/2010'、'DD/MM/YYYY'和date