【问题标题】:Find n largest values in a column在列中查找 n 个最大值
【发布时间】:2012-10-03 09:42:08
【问题描述】:

我正在尝试在 SQL Server 的特定列中查找 n 个最大的数字。

我们可以很容易地找到一列中的最大值和第二大的值。

但是我如何在列中找到 5 个最大值?

【问题讨论】:

  • 你如何找到最大的和第二大的,并且不能简单地修改以找到接下来的 3 个项目?
  • 嗨。感谢您的回复,对不起,我正在使用 mysql,我现在得到了答案。我使用了以下查询,“SELECT TOP 5 * FROM tbl_PRODUCT ORDER BY items_sold DESC;”
  • 我是这样使用的:“SELECT TOP 5 * FROM tbl_PRODUCT ORDER BY items_sold DESC;”现在我的表中有一个外键,(family_ID)我想找到具有最大值的列,但它们应该有不同的family_ID,即我找到family_ID下所有产品中最大的:1,然后我想要最大的都在family_ID 2下

标签: sql sql-server sql-server-2008


【解决方案1】:

您为 MySQL 和 SQL Server 都标记了这个。在 SQL Server 中你可以使用TOP:

SELECT TOP 5 yourColumn
FROM yourTable
ORDER BY someColumn DESC;

TOP 限制返回的行数。要获取具有最大/最小值的数据,您需要包含 ORDER BY

在 MySQL 中,您将使用 LIMIT

在 SQL Server 中执行此操作的另一种方法是使用 row_number()

select id
from 
(
  select id, row_number() over(order by id desc) rn
  from yourtable
) x
where rn <= 5

SQL Fiddle With Demo

【讨论】:

    【解决方案2】:

    在 MySql 中,您可以使用 [LIMIT {[offset,] row_count }] 这样做:

    ...
    ORDER BY SomeField DESC
    LIMIT @n; 
    

    对于 SQL Server,您可以使用 TOP(n) 获取前 n 个:

    SELECT TOP(@n) SomeFieldName
    FROM TABLE
    ORDER BY SomeField DESC
    

    例如:

    SELECT TOP 5 items_sold
    FROM tbl_PRODUCT 
    ORDER BY items_sold dESC
    

    更新:如果您有另一个表 families 与 products 表的外键 family_ID,并且您想查找所有具有前 n 个家庭 id 的产品。然后你可以点这个:

       SELECT *
       FROM Products WHERE family_ID  IN
       (
           SELECT TOP 5 family_ID
           FROM families
           ORDER BY family_ID DESC
       )
    

    更新 2:每个系列中最顶级的产品:

    ;WITH cte
    AS
    (
        SELECT *, 
        ROW_NUMBER() OVER(PARTITION BY family_ID ORDER BY items_sold DESC) row_num
        FROM @Products
    )
    SELECT * FROM cte
    where row_num = 1
    Order by family_ID
    

    Here is alive demo

    【讨论】:

    • 从 tbl_PRODUCT ORDER BY items_sold 中选择 TOP 5 这不正确吗?我收到一个错误,“关键字'FROM'附近的语法不正确。”
    • @pseudoname 抱歉,您需要指定要选择的列,例如 ItemIDItemPrice。查看我的编辑
    • 感谢您回答 Mahmoud,它有效,我这样使用它:“SELECT TOP 5 * FROM tbl_PRODUCT ORDER BY items_sold DESC;”现在我的表中有一个外键,比如 family_ID 我想找到具有最大值的列,但它们应该有 diff family_ID 即,我在 family_ID 下找到所有产品中最大的:1,然后我想要所有产品中的最大在family_ID 2下
    • @pseudoname - 所以你有另一个表 families 与产品表的外键 family_ID 对吗?并且您想查找前 n 个家庭 id 下的所有产品吗?
    • 即,我要各家最顶级的产品
    【解决方案3】:

    sql 服务器

    select min(val)
     from your_table
    where val in (select top 5 val from your_table  order by val desc)
    

    mysql

    select min(val)
     from your_table
    where val in (select val from your_table  order by val desc limit 5)
    

    【讨论】:

      猜你喜欢
      • 2016-05-24
      • 1970-01-01
      • 2014-07-11
      • 2022-01-26
      • 1970-01-01
      • 2014-01-12
      • 2018-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多