2013-09-28 17 views
0

我有一個表v_leaveallocation_ms,其中包含I_EmpIDI_EmpName等常用列和I_EarnLeaveI_FromDate兩個條目。關於在Oracle中對列進行分組的問題

現在我想通過獲取I_Fromdate的最後一個條目來獲取I_EarnLeave,從而將2行變爲單行。

select distinct I_empid, I_empname, I_Earnleave, max(I_FromDate) 
from v_leaveallocation_ms 
where i_departmentid = 2 
group by I_empid, I_empname, I_Earnleave 

我得到了重複的條目。請建議我。 enter image description here

+0

顯示你的SQL查詢結果替換row_number()

select i_empid, i_empname, i_earnleave, i_fromdate from ( select i_empid, i_empname, i_earnleave, i_fromdate, row_number() over (partition by i_empid order by i_fromdate desc) as rn from v_leaveallocation_ms where i_departmentid = 2 ) t where rn = 1; 

sunysen

+0

有沒有重複的,因爲'i_earnleave'的值是不同的。你想要返回勞倫斯的兩個價值中的哪一個? –

回答

1

你在找這樣的嗎?

SELECT l.I_empid, l.I_empname, l.I_Earnleave, l.I_FromDate 
    FROM 
(
    SELECT I_empid, MAX(I_FromDate) I_FromDate 
     FROM v_leaveallocation_ms 
    WHERE i_departmentid = 2 
    GROUP BY I_empid  
) q JOIN v_leaveallocation_ms l 
    ON q.I_empid = l.I_empid 
    AND q.I_FromDate = l.I_FromDate 

子查詢你搶MAX(I_FromDate)I_empid然後加入你回你的表從相應的行得到其他列。

第二種方法是使用ROW_NUMBER()解析函數

SELECT I_empid, I_empname, I_Earnleave, I_FromDate 
    FROM 
(
    SELECT I_empid, I_empname, I_Earnleave, I_FromDate, 
      ROW_NUMBER() OVER (PARTITION BY I_empid ORDER BY I_FromDate DESC) rnum 
    FROM v_leaveallocation_ms 
    WHERE i_departmentid = 2 
) q 
WHERE rnum = 1 

輸出:

 
| I_EMPID |  I_EMPNAME | I_EARNLEAVE |      I_FROMDATE | 
|---------|---------------|-------------|----------------------------------| 
|  21 |  Lawrence |   24 | September, 16 2013 00:00:00+0000 | 
|  28 | N.R.Santharam |   12 | November, 11 2013 00:00:00+0000 | 

這裏是SQLFiddle演示(兩個查詢

+0

這將仍然返回勞倫斯兩次,因爲兩行都具有相同的'i_fromdate' –

+0

@a_horse_with_no_name我相信它不會因爲OP顯示'MAX(I_FromDate)'而不是'I_FromDate'。他發佈他的查詢結果並不簡單,從實際的表中選擇。 – peterm

+0

啊,對(但如果*有*兩行具有相同的最大值,則兩者都會返回)。 –

1

你不必在發佈的結果中重複。勞倫斯的兩行有不同的i_earnleave。你需要選擇其中的一個。如果您想要更高要求,請從group by中刪除該列並應用一個max()就可以了。

select I_empid, I_empname, max(I_Earnleave), max(trunc(I_FromDate)) 
from v_leaveallocation_ms 
where i_departmentid = 2 
group by I_empid, I_empname; 

如果你需要的所有列是屬於例如最新i_fromdate你可以使用一個窗口功能:如果你想行與同i_fromdate退換兩次,你可以用dense_rank()