2014-10-20 166 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