选择多个记录 - MySQL
问题描述:
尝试按每种类型排序的记录列表以及每种类型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;
答
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
T. *和T.seq中T代表什么?你能向我解释SQL实际上在做什么,特别是CASE部分吗? – AznDevil92 2014-10-20 19:42:03
我们在gis类型相同的情况下维护一个rownum变量和gistype变量,我们增加rownum,否则我们将rownum重置为1,因为我们用g.4digits命令结果,具有相同gistype的所有行将按顺序排列行数,直到找到下一个gis类型,其中行号将再次从1开始。这是在gis类型上分区数据并在该分区中给出行号。 T是具有行号列和其他列的子查询的别名。现在外围选择只在每个桶中排名前五。 – radar 2014-10-20 19:45:13
谢谢你的澄清。但在我看来,它拉动了前5名的分数。我会在哪里将其更改为底部5? – AznDevil92 2014-10-20 19:57:14