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