2015-01-16 54 views
0

我有一個查詢,我需要在常規表中提取數據並將兩行數據放入一行。
我有包括Oracle 11g - 創建並列比較表comlumn數據

StudentID AUDIT_ACTN  Audit_Date ..... 
aaa   A    01/01/2010 
aaa   A    03/04/2011  
aaa   A    02/02/2013 
aaa   D    09/10/2010 
aaa   D    05/06/2011 
aaa   D    06/07/2013 
aaa   A    11/12/2014~ 
bbb   A    01/01/2010 
bbb   A    03/04/2011  
bbb   A    02/02/2013 
bbb   D    09/10/2010 
bbb   D    05/06/2011 
bbb   D    06/07/2013 
bbb   A    11/12/2014~ 

行我想這樣

StudentID AUDIT_ACTN Audit_Date StudentID AUDIT_ACTN Audit_Date 
aaa   A   01/01/2010 aaa   D   09/10/2010 
aaa   A   03/04/2011 aaa   D   05/06/2011 
aaa   A   02/02/2013 aaa   D   06/07/2013 
aaa   A   11/12/2014  NULL  NULL  NULL 
bbb   A   01/01/2010 bbb   D   09/10/2010 
bbb   A   03/04/2011 bbb   D   05/06/2011 
bbb   A   02/02/2013 bbb   D   06/07/2013 
bbb   A   11/12/2014  NULL  NULL  NULL 

的一個& d數據行的相關輸出,A =的東西添加到記錄和d =刪除的東西記錄(某事是一個指標)。這是合乎邏輯的,因爲您必須在刪除它之前添加一些內容,並且無法將其添加兩次,而無需先刪除它。

我當前的腳本可能會走錯路,但這裏走;

select a.StudentId,a.Audit_Date,a.AUDIT_ACTN,d.StudentId,Audit_Date,d.AUDIT_ACTN, 
from table a 
join 
(select * 
    from 
    (Select StudentId, Audit_Date,AUDIT_ACTN 
     from table b 
     Where b.AUDIT_ACTN='D' 
     order by Audit_Date 
    ) 
    where rownum=1 
    ) d on a.StudentId = d.StudentId 
and a.AUDIT_ACTN='A' 
and Select * from (Select Audit_Date 
Order by a.StudentId, a.Audit_Date 

我知道這是錯誤的,但我在哪裏何去何從。如果任何人都能幫助並指引我朝着正確的方向發展。這將不勝感激。

我目前的嘗試爲我帶來了零行,當我拿出rownum時,它帶給我一個x連接,返回12行。 感謝 羅傑

+0

我不知道,我跟着你如何找出聚合函數,其中A列映射到其D行。樣本中的所有行都與同一個「StudentID」相關。你是否剛剛與他們聯繫,說特定學生的第一個D(由audit_date命令)必然與第一個A(由audit_date'再次排序)匹配?這在你構建的場景中似乎不太可能 - 我可能會以不同的順序刪除值,而不是添加它們或刪除一些值而不是其他值。 –

+0

謝謝你的想法。行不會被刪除。這是一個審計表,記錄系統中的操作。你是對的 - 沒有硬鏈接,只有邏輯鏈接。例如aaa在某個日期分配給他們的指標,然後在另一個日期之後將其刪除。然後在某個日期再次重新添加。因此,您不能在沒有刪除交易的情況下向該人添加指標(除非第一次添加該指標)。沒有添加交易,您不能刪除指標。樣本中的日期反映了這一點(我希望)。我希望這解釋更多一點。 – Darklantern

回答

0

我認爲你需要像下面

select 
     A.StudentId,A.Audit_Date,A.AUDIT_ACTN, 
     D.StudentId,D.Audit_Date,D.AUDIT_ACTN 
    from 
    (Select StudentId, Audit_Date,AUDIT_ACTN,ROW_NUMBER() 
    OVER (PARTITION BY StudentId order by audit_date) rn 
      from table b 
      Where b.AUDIT_ACTN='D' 
    ) D 
    FULL OUTER JOIN 
    (Select StudentId, Audit_Date,AUDIT_ACTN,ROW_NUMBER() 
    OVER (PARTITION BY StudentId order by audit_date) rn 
      from table b 
      Where b.AUDIT_ACTN='A' 
    ) A 
    on A.rn = D.rn and A.StudentId = B.StudentId 

我希望這將工作

+0

謝謝,這對於1個學生的ID很好,但不是多個學生ID,還需要一個studentid比賽。謝謝你的努力。 – Darklantern

+0

謝謝,關閉但沒有雪茄。這在學生Id和rownnum組合不匹配的地方失敗了,我在一行上得到不同的studentID。我試圖通過studentid,audit_date對錶a,d進行排序,但這確實起作用。我認爲分區(?)可能工作? – Darklantern