多列排序的SQL Order by

19
我有以下结果。
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。由于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不能输出所需的结果。有什么帮助吗?


你能否发布全部查询/表结构?你的ORDER BY子句看起来应该可以工作… - Mike G
你能进一步评论供应商的排序吗?请参考对我的回答所提出的问题。 - David Aldridge
@David - 最新事故的供应商应该排在前面,如果有第二个供应商与相同的事故日期(在情况下打结),那么可以将其放在下面。 - Pankaj
那么你会使用供应商名称来打破平局吗? - David Aldridge
4个回答

32

使用分析函数:

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 这些链接提供了有关IT技术的相关信息。建议您查看这些链接以获取更多详细信息。请注意保留HTML标记。

4
这将完成它...
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

1
按照事故日期第二排序并不一定会显示所有供应商的事故,如果有两个供应商具有相同的最新事故日期。 - Roger
确实,这是一个关于如何处理它的开放性问题。 - David Aldridge
不是这样的:“它应该首先与同一供应商的所有其他事件一起出现,然后再与下一个供应商及其所有相关事件一起出现” 致敬 :) - Roger
实际上这里有几个问题。第二个及以上供应商的供应商订购问题在问题中没有定义。它可能是所有供应商都按其最近事件排序,或者它可能是按供应商名称排序,跟随最新事件的供应商。如果多个供应商在最近事件日期上并列,我们可以交错他们的事件,或按供应商名称排序,或使用第二个最近事件日期进行打破平局,然后是第三个等等。 - David Aldridge

0
如果您正在使用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;

-2
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接