SQL 需要聚合函数而不是奇异值

Posted

技术标签:

【中文标题】SQL 需要聚合函数而不是奇异值【英文标题】:SQL requires aggregate function over singular value 【发布时间】:2016-04-14 14:15:43 【问题描述】:

我有包含国家、名称和百分比列的表格语言。

样本集可能如下所示:

+---------+---------+------------+
| country |  name   | percentage |
+---------+---------+------------+
| usa     | english |         85 |
| usa     | spanish |         10 |
| usa     | german  |          5 |
| germany | german  |        100 |
+---------+---------+------------+
I want to get
+---------+---------+------------+
| country |  name   | percentage |
+---------+---------+------------+
| usa     | english |         85 |
| germany | german  |        100 |
+---------+---------+------------+

select country, name, max(percentage) from language group by country

告诉我我需要将除一列之外的所有列放入聚合函数或分组依据。 如果将名称放入分组依据,您将得到原始表,因为所有国家和名称对都是唯一的。 名称应该是一个特定的值,因为只能有一对国家和最大百分比,所以也没有什么可以比较的,反正它是一个字符串。

我确信有一种简单的方法可以解决这个问题,无需执行任何第二个选择语句和连接表等。

【问题讨论】:

Classic example greatest-n-per-group 问题。 问题不在于如何解决,问题在于您是否可以通过类似于 OP 中的简单查询来解决它。 ... 最简单的查询在链接的答案中。您无法摆脱 DB2 上的某种连接/嵌套选择。 好的,非常感谢。如果你提交这个作为答案,我会给你闪亮的星星。 【参考方案1】:

如果您想要最大百分比,请使用row_number()

select l.*
from (select l.*,
             row_number() over (partition by country order by percentage desc) as seqnum
      from language l
     ) l
where seqnum = 1;

【讨论】:

以上是关于SQL 需要聚合函数而不是奇异值的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER开窗函数

开窗函数

重学SQL窗口函数

Sql Service的艺术 SQL聚合函数的应用

sql server中啥是聚合函数

sql聚合函数的应用