2017-06-23 101 views
0

原始表:如何用sql语句生成结果?

enter image description here

见国家列中的结果。 总之,我想列举每个国家人口最多的省份,然后列出每个国家人口第二多的省份。

有人可以帮助我吗?

+0

尝试以文本格式给出数据而不是图像,因为我们无法复制图像的文本以复制相同的图像。 – Utsav

回答

0

Rextester Demo

有你期望的输出2倍的差异。

  1. c2p1 800放置c3p2 900我假设是不正确之前。

  2. 因此,第7行是c2p1,但它应该是c3p1,我相信是一个错字。

此外,我遗漏了生成序列号的逻辑给你,你可以轻松地谷歌。

select t1.country,t1.province,t1.population 
from tbl1 t1 
inner join tbl1 t2 
on t1.country=t2.country 
where t1.population <= t2.population 
group by t1.country,t1.province 
order by count(*),t1.population desc; 

输出

+---------+----------+------------+ 
| country | province | population | 
+---------+----------+------------+ 
| C1  | C1P3  |  1500 | 
| C3  | C3P2  |  900 | 
| C2  | C2P1  |  800 | 
| C4  | C4P1  |  100 | 
| C1  | C1P1  |  1000 | 
| C2  | C2P2  |  500 | 
| C3  | C3P1  |  100 | 
| C1  | C1P2  |  500 | 
+---------+----------+------------+ 

说明:自与where条件where t1.population <= t2.population加入,group by t1.country,t1.province将复制窗口功能row_Number() over partition by这是不是可以在MySQL。

限制:假设ONLY_FULL_GROUP_BY已禁用,否则您需要再次加入才能显示​​,因为它不在group by字段中。

+0

谢谢!那是真实的。 ONLY_FULL_GROUP_BY已被禁用 –

+0

@WubinOuyang如果它对您有用,请随时接受答案,以便可以关闭该问题。 – Utsav

0

通过在人口和限制条款中使用降序排序,可以轻松获取枯萎列表。为了让两个列表,你可以使用一个联盟的两个列表:

SELECT * 
FROM 
    (
     SELECT 
      '1' as `rank_group`, 
      `province`, 
      `population`, 
      `country` 
     FROM `table` a 
     GROUP BY `province`,`country` 
     ORDER BY `population` DESC 
     LIMIT 0,1 
    ) 
UNION 
SELECT * 
FROM 
    (
     SELECT 
      '2' as `rank_group`, 
      `province`, 
      `population`, 
      `country` 
     FROM `table` a 
     GROUP BY `province`,`country` 
     ORDER BY `population` DESC 
     LIMIT 1,1 
    ) 
ORDER BY `rank_group`,`population` DESC;