web-dev-qa-db-fra.com

Sql Trier par plusieurs colonnes

J'ai le résultat ci-dessous 

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 

Je veux commander VendorName qui a le dernier incident. Le fournisseur ABC a le dernier incident et doit donc venir en premier avec tous les autres incidents du même fournisseur, puis le prochain fournisseur avec tous les incidents respectifs, par ordre décroissant. Le résultat souhaité est le suivant:

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 ne donne pas la sortie désirée. De l'aide ?

12
Pankaj

Utiliser des fonctions analytiques:

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

Voir: 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

Cela va le faire ...

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

... mais je ne suis pas sûr que la fonction analytique soit autorisée dans ORDER BY. Si ce n'est pas le cas, calculez-le dans une sous-requête et triez-le dans la requête principale ...

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

Si vous êtes sur une installation RAC

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