2010-05-20 121 views
1

不好意思發表類似的問題。請考慮一下:選擇一列有最大值的行 - 在日期範圍內

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

回答

2

如果您提供了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; 
0

我還沒試過這個,認爲你想要的東西是這樣的:

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

2

您正在彙總您的數據,因此請使用分組和彙總功能。你可以添加任何你想要的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

相關問題