【问题标题】:How to write SQL query to get the 2nd heaviest animal from each zoo?如何编写 SQL 查询以获取每个动物园中第二重的动物?
【发布时间】:2020-10-01 05:22:12
【问题描述】:

这是两个表(animal_weight 和 zoo_directory):

我对如何从每个动物园取回第二重的动物感到困惑。我在考虑使用 MAX 函数或子查询,但我不完全确定。这是我目前得到的查询:

SELECT
zoo_directory.zoo_ID AS 'zoo_ID',
zoo_name,
weight_lbs
FROM animal_weights 
INNER JOIN zoo_directory
ON animal_weights.zoo_ID = zoo_directory.zoo_ID
ORDER BY zoo_name ASC;

返回这个:

【问题讨论】:

    标签: sql database sqlite


    【解决方案1】:

    我们可以使用dense_rank 窗口函数给每个动物园的权重排名,然后过滤掉第二高的。

    select zoo_id,zoo_name,weight_lbs
    from
    (
    select z.zoo_id as 'zoo_ID'
          ,zoo_name
          ,weight_lbs
          ,dense_rank() over (partition by  z.zoo_id order by weight_lbs desc) rnk
      from animal_weights a
      inner join zoo_directory z
      on a.zoo_id = z.zoo_id
    )
    where rnk = 2;
    

    【讨论】:

    • 非常感谢!我是否必须为子查询添加别名?
    • @Aidan Mendonca,像MySQLSQL Server 这样的一些数据库会给出语法错误,而OracleSQLite 不需要为子查询提供别名。但我同意您的意见,我们可以始终提供alias 名称。
    【解决方案2】:

    试试这个:

    SELECT 
        b.zoo_ID AS 'Zoo_ID',
        b.zoo_name AS 'Name',
        MAX(a.weight_lbs) AS 'Weight'
    FROM
        animal_weight a
            INNER JOIN
        zoo_directory b ON a.zoo_ID = b.zoo_ID
    WHERE
        a.weight_lbs NOT IN (SELECT 
                MAX(a.weight_lbs)
            FROM
                animal_weight a
                    INNER JOIN
                zoo_directory b ON a.zoo_ID = b.zoo_ID
            GROUP BY b.zoo_name)
    GROUP BY b.zoo_name;
    

    【讨论】:

    • 谢谢它也很有效。我在 MSSQL 虚拟环境中使用它并给了我一个错误,但是当我在 SQLITE 中运行它时它工作了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 2017-02-23
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多