2017-06-23 128 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;