2014-10-20 193 views
0

嘗試按每種類型排序的記錄列表以及每種類型5條記錄的限制。選擇多個記錄 - MySQL

例如:

我有25個不同的代碼GICS如2050,4010,2540等。而每個GICS代碼是不同類型的行業,如2050年銀行,4010年是汽車,2540年是化妝品。

現在每個GICS代碼都被分配到多個公司名稱並被賦予一個分數。我希望能夠從每個GICS代碼中選擇最低的5家公司。

可能嗎?或者我需要多個SQL?

下面是我的SQL:

select g.4digits, c.company_name, os.* from overall_scores os 
join company c 
on c.company_id = os.company_id 
join gics g 
on g.company_id = c.company_id 
where g.4digits in ((2550), (4010), (2540)) 
and os.overall_score <> 'NA' 
and os.overall_score <> 'NaN' 
order by os.overall_score asc limit 5; 

回答

1

MySQL不支持像ROW_NUMBER可以用來解析函數。 我們可以使用變量來做到這一點

SELECT T.* 
    FROM (SELECT g.4digits, c.company_name, os.*, 
       CASE 
       WHEN @gistype != g.4digits THEN @rownum := 1 
       ELSE @rownum := @rownum + 1 
       END AS seq, 
       @gistype := g.4digits AS var_gistype 
      FROM overall_scores os 
      JOIN company c 
      ON c.company_id = os.company_id 
      JOIN gics g 
      ON g.company_id = c.company_id 
      AND g.4digits in ((2550), (4010), (2540)) 
      AND os.overall_score <> 'NA' 
      AND os.overall_score <> 'NaN' 
      JOIN (SELECT @rownum := NULL, @gistype := '') r 
     ORDER BY g.4digits, os.overall_score asc) T 
WHERE T.seq <= 5 
+0

T. *和T.seq中T代表什麼?你能向我解釋SQL實際上在做什麼,特別是CASE部分嗎? – AznDevil92 2014-10-20 19:42:03

+1

我們在gis類型相同的情況下維護一個rownum變量和gistype變量,我們增加rownum,否則我們將rownum重置爲1,因爲我們用g.4digits命令結果,具有相同gistype的所有行將按順序排列行數,直到找到下一個gis類型,其中行號將再次從1開始。這是在gis類型上分區數據並在該分區中給出行號。 T是具有行號列和其他列的子查詢的別名。現在外圍選擇只在每個桶中排名前五。 – radar 2014-10-20 19:45:13

+0

謝謝你的澄清。但在我看來,它拉動了前5名的分數。我會在哪裏將其更改爲底部5? – AznDevil92 2014-10-20 19:57:14