Sql Order by 在多列上
Posted
技术标签:
【中文标题】Sql Order by 在多列上【英文标题】:Sql Order by on multiple column 【发布时间】:2012-12-15 23:09:26 【问题描述】:我有以下结果
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
没有提供所需的输出。有什么帮助吗?
【问题讨论】:
你能发布整个查询/表结构吗?您的ORDER BY
子句看起来应该可以工作...
您能否进一步评论供应商的订单?查看针对我的回答提出的问题
@David - 有最新事件的供应商应该排在首位,我可以让第二个事件日期相同的供应商(以防捆绑)按顺序排列。
所以你会使用供应商名称打破平局?
【参考方案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
【讨论】:
如果有两个供应商具有相同的最新事件日期,则按事件日期第二次排序不一定会显示所有供应商的事件。 是的,关于如何处理这个问题有点悬而未决。 不,不是:it should come first with all other incident for same vendor and then next Vendor with all respective incident
问候 :)
其实这里有几个问题。问题中没有定义第二个以上供应商的供应商订购问题。可能是所有供应商都按照他们最近的事件进行订购,或者可能是他们按照最近发生的事件的供应商名称订购。如果多个供应商在最近的事件日期打成平手,我们可以交错他们的事件,或按供应商名称排序,或与第二个最近的事件日期打平,然后是第三个等等。【参考方案3】:
如果您正在安装 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;
【讨论】:
【参考方案4】: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
【讨论】:
以上是关于Sql Order by 在多列上的主要内容,如果未能解决你的问题,请参考以下文章