【问题标题】:SQL finding person entry has the most dogsSQL查找人条目有最多的狗
【发布时间】:2010-08-08 09:54:31
【问题描述】:

人(身份证,狗)

如何找到养狗最多的人

select *
from person p1
where p1.id in (
    select p2.id
    from person p2
    where p1.id = p2.id
    having count(dogs > (
        select p3.id ...etc

我是在正确的轨道上还是这行不通? 感谢观看

【问题讨论】:

  • 您使用的是哪个数据库?
  • 它的 oracle 数据库,效率并不重要,因为它相当小(几百个条目)
  • 非常感谢您的回复

标签: sql oracle plsql


【解决方案1】:

这个怎么样?

select *
from person
where dogs = (select max(dogs) from person)

可能不是最有效的方法,但这会给你一个(或多个)狗数量最多的人。如果你只想要其中一个,你可以这样做:

select top 1 
from person
order by dogs desc

【讨论】:

    【解决方案2】:

    对它们排序并取第一行:

    SELECT *
    FROM person
    ORDER BY dogs DESC
    LIMIT 1
    

    注意只获取第一行varies depending on your database的方式。

    由于您没有指定数据库,这只是一个示例。对于 SQL Server,您可以改用 SELECT TOP 1

    现在我看到您已经更新了您的问题。对于 Oracle,您可以使用 ROWNUM

    SELECT *
    FROM
    (
        SELECT *
        FROM person
        ORDER BY dogs DESC
    ) WHERE rownum = 1
    

    【讨论】:

    • LIMIT 不是有效的 Oracle 语法
    • @APC:语法因数据库而异。我会更新我的答案来提及这一点。
    【解决方案3】:

    假设 DOGS 是关于 PERSONS 的列,使用 rank() 分析函数是最简洁的方法。按 DOGS 降序排列意味着拥有最多狗的人排名为 1。

    select * from
       ( select p.*
                rank() over (order by p.dogs desc) as rnk
         from person p )
    where rnk = 1
    /
    

    rank() 的优点是如果两个人并列的狗数量最多,则两行都将返回。根据业务逻辑,这通常是理想的结果。如果您真的必须有单行,则需要更强的分区条件或更精细的排序标准。或者,分析 row_number() 保证返回一行,如果你不关心你得到了哪些并列记录。

    Oracle 具有一系列强大的分析功能。 Find out more.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 2019-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多