web-dev-qa-db-de.com

SQL Order by in mehreren Spalten

Ich habe das untenstehende Ergebnis 

VendorName | IncidentID | IncidentStatus | IncidentDate
-------------------------------------------------------
XYZ        | 100        |     Open       | 02-JUN-2011    
XYZ        | 101        |     Open       | 03-JUN-2011  
ABC        | 102        |     Open       | 01-JUN-2011  
XYZ        | 103        |     Open       | 01-APR-2011  
ABC        | 105        |     Open       | 05-JUN-2011 

Ich möchte VendorName mit dem neuesten Vorfall bestellen. Hersteller ABC hat den neuesten Vorfall, daher sollte er zuerst mit allen anderen Vorfällen für denselben Anbieter und dann mit dem nächsten Anbieter mit allen entsprechenden Vorfällen in absteigender Reihenfolge zusammenkommen. Das gewünschte Ergebnis lautet wie folgt:

VendorName | IncidentID | IncidentStatus | IncidentDate  
-------------------------------------------------------
ABC        | 105        |     Open       | 05-JUN-2011 
ABC        | 102        |     Open       | 01-JUN-2011
XYZ        | 101        |     Open       | 03-JUN-2011 
XYZ        | 100        |     Open       | 02-JUN-2011    
XYZ        | 103        |     Open       | 01-APR-2011  

ORDER BY IncidentDate desc, VendorName liefert nicht die gewünschte Ausgabe. Irgendeine Hilfe ?

12
Pankaj

Verwenden Sie analytische Funktionen:

SELECT *
FROM(
    SELECT 
        VendorName, 
        IncidentID, 
        IncidentStatus, 
        IncidentDate, 
        MAX(IncidentDate) OVER (PARTITION BY VendorName) maxDate
    FROM yourTable
) t
ORDER BY t.maxDate DESC, t.VendorName ASC, t.IncidentDate DESC

Siehe: http://docs.Oracle.com/javadb/10.8.2.2/ref/rrefsqlj13658.htmlhttp://docs.Oracle.com/cd/E11882_01/ server.112/e10592/functions003.htmhttp://docs.Oracle.com/cd/E11882_01/server.112/e26088/functions004.htm

26
Roger

Das wird es tun ...

ORDER BY MAX(INCIDENTDATE) OVER (PARTITION BY VENDORNAME) DESC, INCIDENTDATE DESC

... aber ich bin nicht sicher, ob die analytische Funktion in ORDER BY zulässig ist. Wenn nicht, berechnen Sie es in einer Unterabfrage und ordnen Sie in der Hauptabfrage nach ...

select ...
from   (
  select Max(incidentdate) over (partition by vendorname) max_incidentdate_by_vendor,
         ...)
order by max_incidentdate_by_vender desc, incidentdate desc
4
David Aldridge

Wenn Sie sich in einer RAC-Installation befinden

set linesize 300
column REDOLOG_FILE_NAME format a50
SELECT
    a.INST_ID,
    a.GROUP#,
    a.THREAD#,
    a.SEQUENCE#,
    a.ARCHIVED,
    a.STATUS,
    b.MEMBER    AS REDOLOG_FILE_NAME,
    (a.BYTES/1024/1024/1024) AS SIZE_GB
FROM gv$log a
JOIN gv$logfile b ON a.Group#=b.Group# 
AND a.INST_ID=b.INST_ID 
ORDER BY a.INST_ID ASC, a.GROUP# ASC;
0
user10054759