2016-10-28 4 views
0

Ich kann nicht meinen Kopf um diese zu bekommen, ich habe eine „funcky“ Unterabfrage:Auswahl gruppierte Datensätze basierend auf max Wert in einer Spalte

SELECT 
"Requisition_ID", 
"Candidate_ID", 
"Application_Date", 
CA."Process_of_Activity", 
CA."Activity", 
"Completed_on", 
add_minutes(cast("Completed_on" as timestamp),STAT."Rank") as "Current Completed on" 

FROM CA 

left join STATUS as STAT 
on CA."Process_of_Activity" = STAT."Process_of_Activity" and CA."Activity" = STAT."Activity" 
GROUP BY "Requisition_ID","Candidate_ID","Application_Date", STAT."Rank", CA."Process_of_Activity", CA."Activity", "Completed_on"; 

Diese im Grunde gibt mir eine Tabelle mit sieben Spalten. Ich brauche ein Ergebnis mit den gleichen 7 Spalten GROUPED von den ersten 3, wo die letzte Spalte Max ist. Beispielsweise. wenn die ursprüngliche Unterabfrage zeigt mir:

Requisition_ID Candidate_ID Application_Date Process_of_Activity Activity   Completed_on Current Completed on 
123    555   16/12/2015   To be Rejected  Rejection  08/03/2016  08/03/2016 00:29 
123    555   16/12/2015   To be Rejected  Letter:Rejection 08/03/2016  08/03/2016 00:00 
123    555   16/12/2015   Application Entry Questionnaire 16/12/2015  16/12/2015 00:00 
123    555   16/12/2015   Application Entry Application Entr 08/03/2016  08/03/2016 00:01 

in diesem Fall würde ich nur will die erste Zeile dieser Probe, um zu sehen ... so dass ich zu gruppieren will „Requisition_ID“, „Candidate_ID“, " Application_Date“

sondern auch sehen, was die Werte für: CA. "Process_of_Activity", CA. "Activity", "Completed_on"

wo "Current Erledigt am" ist max. aber natürlich viel mehr Anfragen, Kandidaten und Bewerbungsdaten im System. Ich verwende dashDB.

Antwort

1

Sie können row_number/rank/dense_rank für diesen Zweck verwenden. Sie benötigen etwas wie folgt:

SELECT * 
    FROM 
    (
    SELECT "Requisition_ID", 
     "Candidate_ID", 
     "Application_Date", 
     "Process_of_Activity", 
     "Completed_on", 
     cco, 
     ROW_NUMBER()OVER(PARTITION BY "Requisition_ID", 
     "Candidate_ID", 
     "Application_Date" 
     ORDER BY cco DESC)rn 
     FROM 
     (
     SELECT 
      "Requisition_ID", 
      "Candidate_ID", 
      "Application_Date", 
      CA."Process_of_Activity", 
      CA."Activity", 
      "Completed_on", 
      add_minutes(CAST("Completed_on" AS TIMESTAMP),STAT."Rank") AS "cco" 
      FROM CA 
      LEFT JOIN STATUS AS STAT 
      ON CA."Process_of_Activity" = STAT."Process_of_Activity" AND CA."Activity" = STAT."Activity" 
      GROUP BY "Requisition_ID", 
       "Candidate_ID", 
       "Application_Date", 
       STAT."Rank", 
       CA."Process_of_Activity", 
       CA."Activity", 
       "Completed_on" 
     ) AS INNER_QUERY)AS OUTER_QUERY 
    WHERE rn=1  

Diese SQL nicht kompiliert auf dasdb aber row_number Funktion ist wichtig. es wird dir eine Idee geben.

+1

Hallo, ich bekomme diesen Fehler: Ein unerwartetes Token "QUALIFY" wurde nach "" Completed_on "gefunden x). Erwartete Tokens können enthalten: "HAVING" .. SQLCODE = -104, SQLSTATE = 42601, DRIVER = 3.69.56 –

+0

@MikePala verwenden, wo statt qualifizieren. –

+0

Wenn ich "HAVING" anstelle von QUALIFY verwende, bekomme ich Folgendes: Ungültige Verwendung einer Aggregatfunktion oder OLAP-Funktion. SQLCODE = -120, SQLSTATE = 42903, DRIVER = 3.69.56 –

Verwandte Themen