2017-06-14 143 views
0

我嘗試了很多解決方案,似乎沒有任何工作。我正在嘗試返回項目的MAX狀態日期。如果該項目在同一天有多個項目,那麼我需要返回MAX ID。到目前爲止,我已經試過這樣:SQL從多行中返回最大值

SELECT PRJSTAT_ID, PRJSTAT_PRJA_ID, PRJSTAT_STATUS, PRJSTAT_DATE 
From Project_Status 
JOIN 
(SELECT MAX(PRJSTAT_PRJA_ID) as MaxID, MAX(PRJSTAT_DATE) as MaxDate 
FROM Project_Status 
Group by PRJSTAT_PRJA_ID) 
On 
PRJSTAT_PRJA_ID = MaxID and PRJSTAT_DATE = MaxDate 
Order by PRJSTAT_PRJA_ID 

它返回如下:

Results

我獲得多個記錄PRJSTAT_PRJA_ID,但我只希望與MAX PRJSTAT_ID返回的行。有什麼想法嗎?

+0

請仔細閱讀http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images代碼是這樣提出問題/ 285557和接受的答案 –

+0

我正在使用Oracle。 – hkimberlin

+0

對不起,圖片。我將不會在將來使用它們。 – hkimberlin

回答

0

取出MAX上的ID的子查詢:

SELECT PRJSTAT_ID, PRJSTAT_PRJA_ID, PRJSTAT_STATUS, PRJSTAT_DATE 
From Project_Status 
JOIN 
(SELECT PRJSTAT_PRJA_ID as ID, MAX(PRJSTAT_DATE) as MaxDate 
FROM Project_Status 
Group by PRJSTAT_PRJA_ID) 
On 
PRJSTAT_PRJA_ID = ID and PRJSTAT_DATE = MaxDate 
Order by PRJSTAT_PRJA_ID 
+0

我仍然得到重複的行。 – hkimberlin

0

或刪除需要加入:

SELECT * FROM  
(SELECT PRJSTAT_ID, PRJSTAT_PRJA_ID, PRJSTAT_STATUS, PRJSTAT_DATE, 
ROW_NUMBER() OVER (PARTITION BY PRJSTAT_PRJA_ID ORDER BY PRJSTAT_DATE DESC) 
AS SEQ, 
ROW_NUMBER() OVER (PARTITION BY PRJSTAT_PRJA_ID ORDER BY PRJSTAT_PRJA_ID 
DESC) AS IDSEQ 
From Project_Status 
)PR 
WHERE SEQ = 1 
AND IDSEQ = 1 
+0

謝謝!這完美的作品! – hkimberlin

0

你的問題是聯繫。您希望記錄的最大日期爲PRJSTAT_PRJA_ID,並且在與最高ID的記錄匹配的情況下。排名每組記錄只保留最佳戰績最簡單的方法是ROW_NUMBER

select prjstat_id, prjstat_prja_id, prjstat_status, prjstat_date 
from 
(
    select 
    project_status.*, 
    row_number() over (partition by prjstat_prja_id 
         order by prjstat_date desc, prjstat_id desc) as rn 
    from project_status 
) 
where rn = 1 
order by prjstat_prja_id;