2017-06-14 3 views
0

Ich habe viele Lösungen ausprobiert und nichts scheint zu funktionieren. Ich versuche, das MAX-Statusdatum für ein Projekt zurückzugeben. Wenn das Projekt mehrere Elemente am selben Datum hat, muss ich die MAX ID zurückgeben. Bisher habe ich das versucht:SQL Return MAX Werte aus mehreren Zeilen

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 

Es gibt die folgende:

Results

Ich erhalte mehrere Datensätze für PRJSTAT_PRJA_ID, aber ich möchte nur die Zeile mit dem MAX PRJSTAT_ID zurückzukehren. Irgendwelche Gedanken?

+0

Bitte lesen Sie http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images -von-Code-auf-so-wenn-eine-Frage/285557 und die akzeptierte Antwort –

+0

Ich benutze Oracle. – hkimberlin

+0

Sorry über das Bild. Ich werde sicher sein, sie in der Zukunft nicht zu verwenden. – hkimberlin

Antwort

0

den MAX Nehmen Sie auf der ID auf der Unterabfrage:

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

Ich bekomme immer noch doppelte Zeilen. – hkimberlin

0

Oder die Notwendigkeit entfernen beizutreten:

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

Danke! Das funktioniert perfekt !! – hkimberlin

0

Ihr Problem Bindungen sind. Sie wollen den Datensatz mit dem maximalen Datum pro PRJSTAT_PRJA_ID und im Falle eines Gleichstandes den Datensatz mit der höchsten ID. Der einfachste Weg, Aufzeichnungen Rang pro Gruppe und halten nur die beste Bilanz ist 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; 
Verwandte Themen