【问题标题】:SQL Finding most spoken language in a country [duplicate]SQL查找一个国家/地区使用最多的语言[重复]
【发布时间】:2017-11-13 16:42:55
【问题描述】:

我正在尝试根据百分比获得一个国家/地区使用最多的语言。我要加入 2 张桌子:

Country(NAME,CODE)
CountryLanguage(Percentage, CountryCode, Language)

加入这两个给我

Aruba           Dutch       5.3
Aruba           English     9.5
Aruba           Papiamento  76.7
Aruba           Spanish     7.4
Afghanistan     Balochi     0.9
Afghanistan     Dari        32.1
Afghanistan     Pashto      52.4
Afghanistan     Turkmenian  1.9
Afghanistan     Uzbek       8.8

我试图通过说来获得最常用的语言

SELECT co.Name, cl.language, max(cl.Percentage)
from Country co, CountryLanguage cl
where co.Code = cl.CountryCode
group by co.Name

这给了我正确的百分比但错误的语言,我哪里出错了?

Afghanistan  Balochi    52.4
Aruba        Dutch      76.7

【问题讨论】:

  • 按 co.name,cl.language 分组会得到你想要的结果
  • 旁注使用正确的 INNER JOIN 语法,而不是旧的逗号 JOIN 语法。
  • @BHouse 这让我为每个国家/地区提供了不止一个输出

标签: mysql sql mysql-workbench


【解决方案1】:

首先请加入inner join...on

您的查询将不起作用,因为它会得到 max(percentage),但会显示给定 country 的任何 language

如果我正确理解了您的架构,那么以下查询应该可以按预期工作:

SELECT co.Name, cl.language, cl.Percentage as percentage
from Country co 
inner join CountryLanguage cl
on co.Code = cl.CountryCode
where (cl.CountryCode,cl.Percentage) in (select CountryCode,max(Percentage)
                                         from CountryLanguage
                                         group by CountryCode)
group by co.Name

【讨论】:

  • 我的意思是它有效,介意解释一下 where 子句的工作原理吗?
  • where 子句将从联接表中选择具有一对 (CountryCode,max(Percentage)) 的行 在您的查询中,您只选择 max(Percentage) ,这将显示任意 language 而不是一个max(Percentage)
【解决方案2】:

你可以使用窗口函数来得到这个答案:

RANKPARTITION 可以解决问题

With RecordedPercentages AS
(
              Select 'Aruba' Country, 'Dutch' LanguageName, Cast (5.3 as float) Percentage
    Union All Select 'Aruba', 'English', 9.5
    Union All Select 'Aruba', 'Papiamento', 76.7
    Union All Select 'Aruba', 'Spanish', 7.4
    Union All Select 'Afghanistan', 'Balochi', 0.9
    Union All Select 'Afghanistan', 'Dari', 32.1
    Union All Select 'Afghanistan', 'Pashto', 52.4
    Union All Select 'Afghanistan', 'Turkmenian', 1.9
    Union All Select 'Afghanistan', 'Uzbek', 8.8
),
MyRanking As
(
    Select 
    Country, LanguageName, Percentage, 
    Rank() Over (Partition by Country Order by Percentage Desc) Ranking
    From RecordedPercentages
)
Select *
From MyRanking
Where Ranking = 1

【讨论】:

  • 您比大多数 MySQL 用户目前所处的位置领先一点。
【解决方案3】:

只需按两列添加组

SELECT co.Name, cl.language, max(cl.Percentage)
from Country co, CountryLanguage cl
where co.Code = cl.CountryCode
group by co.Name,cl.language

【讨论】:

  • 看看我是否这样做,它为每个国家/地区提供了多个输出
猜你喜欢
  • 1970-01-01
  • 2020-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
  • 2019-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多