2017-06-14 117 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;