2014-10-29 331 views
0

下返回每個前10 FOO最高的酒吧值,該值排序從上到下: SELECT top 10 foo, MAX(bar) AS Count FROM tbl GROUP BY foo ORDER BY Count DESC;SQL分組排名前10位最高的多列表達式

怎麼能這種模式可以擴展到陪多個分組列表達式? 即返回每個foo的最高bar1,bar2,bar3 ..值,所有這些值均以DESC形式訂購。

更新根據我的情況,請找下面的查詢和相應的輸出: select top 10 Name as Rg_name, no as Rg_no, MAX(IOPS_Read) as MAX_Riops, MAX(IOPS_Write) as MAX_Wiops, MAX(IOPS_ReadWrite) as MAX_RWiops from rgs GROUP BY Name, no ORDER BY MAX_Riops DESC, MAX_Wiops DESC, MAX_RWiops DESC

Rg_name   Rg_no MAX_Riops MAX_Wiops MAX_RWiops 

VMWARE_RG12  34  5444  117  5461 
VM_RG_02   2  5436  567  5512 
VM_RG_05   11  5327  545  5349 
VM_RG_11   14  3623  644  3631 
VMWARE_VDI_RG7 25  2530  908  2630 
VMWARE_RG_4 16 2182 401  2189  107 
EXCHANGE_RG_1  23  1891  734  2151 
VM_RG_01 47 1801 2338  3586  69 
VMWARE_RG11 33 1696 242  1712  24 
VMWARE_RG_SP_02 18  1504  507  1512

從此我只獲得十大Rg_name所出分組及其相應的指標與像MaxRiops最高值,MAXWiops等。這裏的問題是我發現只有MAXRiops列被命名爲DESC。我想在DESC訂單中還有其他專欄。

+0

查詢是否適合您? – radar 2014-10-29 18:13:09

回答

0

使用ROW_NUMBER你可以得到最高10 BAR1,BAR2值每個FOO的。

with cte 
    as 
    (
    select foo, 
      bar1, 
      bar2, 
      ROW_NUMBER() over (partition by foo order by bar1 desc) seq1, 
      ROW_NUMBER() over ( partition by foo order by bar2 desc) seq2 
    from Table1 
) 
    select foo, bar1, bar2 from cte where seq1 <=10 or seq2 <=10 
    order by bar1 desc, bar2 desc 
+0

感謝您的回覆。我嘗試了您的解決方案,但是我發現類似的問題,例如我更新的問題。只有一列由DESC命令而不是其他命令。 – Jain 2014-10-29 18:23:01

+0

@jain,VMWARE_RG12具有最高的Riops,但VM_RG_01氣最高,所以如何在單個表中獲得最高值? – radar 2014-10-29 18:33:34

+0

雷達,哦是啊!所有這些指標都記錄在特定的時間戳中,並存在於同一個表中。我使這變得複雜。再次感謝您指出這一點! – Jain 2014-10-29 18:40:49

0

你的意思是你有更多的列,你想選擇? 即

Select top 10 foo, Max(bar) Count1, Max(ABC) count2 
from tbl 
Group By foo, bar 
Order By Count1 desc