Sql Order by on multiple column

匿名 (未验证) 提交于 2019-12-03 02:56:01

问题:

I've the below result

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  

I want to order VendorName which has latest incident. Vendor ABC has the latest incident hence it should come first with all other incident for same vendor and then next Vendor with all respective incident in descending order.The desired result is like this -

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 doesn't give the desired output. Any help ?

回答1:

Use analytic functions:

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 

Refer to: 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:

This will do it ...

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

... but I'm not sure if the analytic function is allowed in the ORDER BY. If it isn't, calculate it in a subquery and order by in the main query ...

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 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!