2014-04-18 60 views
0

我有這條記錄。在oracle的一個查詢中使用多個條件

 id   performer   end_time 
     300135  testuser   15-OCT-13 
     300135  testuser   14-OCT-13 
     300135  testuser   12-OCT-13 
     300137  newuser    14-OCT-13 
     300137  newuser    18-OCT-13 

現在我想顯示不同的id,但它會告訴我所有的Id,因爲end_time是不同的。 因此,我需要的是用最新的日期來翻閱我的ID。

所以結果應該是

id  performer  end_time 
    300135 testuser  15-OCT-13 (as 15OCT is the heightest date for 300135) 
    300137 newuser  18-OCT-13 (as 18OCT is the heightest date for 300137) 

目前我有什麼是

 select distinct id, performer, END_TIME from workstep where workstep_name =  'Review' and status ='W_COMPLETED' ....? 

,但是這給了我所有的5 records.where因爲它應該是隻有2,因爲只有2唯一身份'。

請建議

感謝

回答

2

您需要GROUP BY

select id, performer, max(END_TIME) from workstep where workstep_name = 'Review' and status ='W_COMPLETED' group by id,performer 
+0

它表示不是GROUP BY表達式 – junaidp

+0

粘貼您的整個查詢。也許你加了點東西? –

+0

沒有集合函數(總和,平均值,最大值,最小值等)的每個列應該按照區段 –

1

當你問3列(ID,表演者,END_TIME)的唯一行 你會得到行,其中組合所有3列是唯一的(您的第一個數據清單)

沒有足夠的條件從您的第一個列表中獲得cond one。

我假設你想要distint ID,並且對於那個ID,你想選擇記錄,其中END_TIME是最新的。憑藉相同的ID,表演者永遠不會改變。

所以,把只是在SQL(查詢將返回每個ID只有1 reqord):

select ID, max(performer), max(END_TIME) 
from workstep 
where ID in 
(select distinct ID from workstep where <conditions>) 
group by ID 

上面的查詢,如果表演是ID一樣會奏效。 如果表演者可能是不同的,但你想從END_TIME = MAX(END_TIME)行,你將需要更多的顯示出來(查詢可以返回每個ID大於1分的記錄,如果有上END_TIME平手):

select ID, performer, END_TIME from 
from workstep 
where (id, end_time) in 
(
select ID, max(END_TIME) 
from workstep 
where ID in 
(select distinct ID from workstep where <conditions>) 
group by ID 
) 

因此,對於上面的查詢,有一個假設,END_TIME對於具有相同ID的每個記錄是不同的。

這裏是一個更高級的版本是免費從assumtion(每個ID exatly 1個記錄):

select id, performer, end_time 
from (
select ID, performer, END_TIME, 
row_number() over (partition by id order by end_time desc, performer) as No 
from workstep 
where <conditions> 
) 
where No = 1 

問題?