【问题标题】:Selecting a max distinct value选择最大不同值
【发布时间】:2011-03-02 20:59:30
【问题描述】:

我有一个包含电话号码(字符串)和姓名(字符串)的数据库表

相同的数字在不同的行可能有不同的名称

给定一个数字,我想选择最常用的名字

例如给定以下数据,如果使用 555.1234,我应该从查询中返回 Frank

Number   |  Name
-----------------
555.1234 |  Frank
555.1234 |  Fran
555.1234 |  James
555.1234 |  Frank
555.1233 |  Jesse

似乎我应该能够以某种方式将 distinct 和 Max 结合起来,但我无法提出正确的查询来执行此操作。有什么想法吗?

【问题讨论】:

  • 你使用的是什么数据库系统?
  • 我相信它的 mysql,它实际上是一个 Web 服务 api 的背后。如果不是 mysql,则为 IBM。

标签: sql


【解决方案1】:

如果您不知道要传递给查询的电话号码是什么,则可以使用以下方法:

SELECT Number, Name, COUNT(Name) AS NameCount
FROM test
GROUP BY Number, Name
HAVING NameCount > 1
Order BY NameCount DESC
LIMIT 1

这将通过一个名称为您提供最常用的电话号码,并返回电话、姓名和计数。

这是我用来尝试查询的test 表及其值:

Number   | Name
555.1234 | Frank
555.1234 | Fran
555.1234 | James
555.1234 | Frank
555.1234 | Jesse
555.2234 | Frank
555.1234 | Jesse
555.1234 | Frank

让我知道这是否适合你!

【讨论】:

  • 您将如何指定您想要此信息的号码?只需添加一个 where 子句?
  • 没错。您可以在 FROM 声明后添加WHERE Number = 'xxxxxxx'
  • 那么您可能只想按名称分组。
  • 这个查询是在假设数字未知的情况下制作的。如果知道,请听从威尔金斯先生的建议。
【解决方案2】:

据我了解,如果您有一个特定的数字作为输入,那么这可能会根据您使用的数据库起作用。 Capsule 的评论让我意识到情况可能并非如此。 编辑更改为 Count(*),以便(我认为)根据 Jack 的良好评论更清晰。

select Top 1 Name, Count(*) total 
   from phone where number = '555.1234' 
   group by name 
   order by total desc

【讨论】:

  • 如果您知道要查找的电话号码也是很好的解决方案,避免先按号码分组。
  • @Capsule:我正在阅读这个问题,因为这是条件之一......但我很可能是错的。你说得很好。
  • 不,我认为你是对的,我也明白这是条件之一。我正在评论将您的解决方案与 jonwayne 的解决方案进行比较。你们都值得被接受;-)
  • 我确实知道要匹配的号码
  • 这似乎计算了一个数字在表格中出现的总次数,并据此对其进行排序。我想计算某个名称在表中出现特定数字的次数,并为该数字选择最常出现的名称(或包含该名称的行)。
猜你喜欢
  • 2015-11-04
  • 1970-01-01
  • 2013-07-22
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
相关资源
最近更新 更多