Sql Заказывайте по нескольким столбцам

Я получил ниже результат

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 

Я хочу заказать VendorName, который имеет последний инцидент. Поставщик ABC имеет последний инцидент, поэтому он должен быть первым со всем другим инцидентом для одного и того же поставщика, а затем для следующего Поставщика со всем соответствующим инцидентом в порядке убывания. Желаемый результат выглядит следующим образом:

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 не дает желаемого результата. Любая помощь?

Ответ 1

Используйте аналитические функции:

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

Обратитесь к: http://docs.oracle.com/javadb/10.8.2.2/ref/rrefsqlj13658.html http://docs.oracle.com/cd/E11882_01/server.112/e10592/functions003.htm http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions004.htm

Ответ 2

Это сделает это...

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

... но я не уверен, разрешена ли аналитическая функция в ORDER BY. Если это не так, вычислите его в подзапросе и порядке в основном запросе...

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

Ответ 3

select vendorname, incidentid, incidentstatus, incidentdate, max(incidentdate) 
over (partition by vendorname order by incidentdate desc) max_incidentdate
from t1 order by max_incidentdate desc, incidentdate desc