【问题标题】:Select multiple rows from a table where field is the max date从字段为最大日期的表中选择多行
【发布时间】:2026-01-25 01:05:02
【问题描述】:

我有一个名为 Product 的表。我需要选择所有具有 MAX ManufatureDate 的产品记录。

这是表格数据的示例:

Id  ProductName     ManufactureDate
1   Car             01-01-2015
2   Truck           05-01-2015
3   Computer        05-01-2015
4   Phone           02-01-2015
5   Chair           03-01-2015

这是结果应该是什么因为所有记录的最大日期是 05-01-2015 并且这 2 条记录有这个最大日期:

Id  ProductName     ManufactureDate
2   Truck           05-01-2015
3   Computer        05-01-2015

我能想到的唯一方法是首先对整个表进行查询以找出最大日期是什么,然后将其存储在变量@MaxManufatureDate 中。然后在 ManufactureDate=@MaxManufactureDate 处进行第二次查询。有人告诉我有更好的方法。

此表中有 100 万+条记录:

这是我目前的做法:

@MaxManufactureDate = select max(ManufactureDate) from Product
select * from Product where ManufactureDate = @MaxManufactureDate

如果这比在 where 子句中进行子选择要好得多。还是这与在 where 子句中执行子选择完全相同?我不确定查询是否会针对每一行运行,无论 sqlserver 是否将变量值存储在内存中。

【问题讨论】:

    标签: sql sql-server maxdate


    【解决方案1】:
    select * from product
    where manufactureDate = (select max(manufactureDate) from product)
    

    内部select-statements选择最大日期,外部所有具有日期的产品。

    【讨论】:

    • 事先执行内部选择语句并将其存储为变量是否更快?我们不是为您的示例中的每一行运行附加选择吗?此表中有超过 100 万条记录。
    • 如果您的最大制造日期经常变化,您可能不会获得任何性能,但如果它是一个静态值,您最好提前重新声明它。
    • 你知道事先声明它是否会有所作为吗?我的一部分是假设 sql 出去并且每次都进行查询以设置变量。这意味着您的查询与预先设置的性能完全相同。
    • 也许这对你有帮助:*.com/questions/23296223/… 是的,我还认为子查询是针对每一行执行的。
    • 如果子查询引用了外部查询中的某些内容,那么我认为它肯定必须为每一行运行它。就目前而言,SQL Server 可能能够判断没有必要这样做,它只会运行一次。我怀疑这与您现在正在做的事情之间存在很大的性能差异。不过,您始终可以检查执行计划。我会使用子查询来避免必须声明和分配变量。
    【解决方案2】:

    你可以使用子查询

     SELECT * 
     FROM Product 
     WHERE ManufactureDate = (
       SELECT ManufactureDate 
       FROM Product 
       ORDER BY ManufactureDate 
       LIMIT 1
     );`
    

    您可能需要使用ASCDESC 来收集正确的订单

    【讨论】:

    • 这将在 mysql 中工作,但它被标记为 sql server。 sql server 没有限制。
    • 好的...刚刚注意到 SQL 和 MaxDate 标记
    【解决方案3】:

    试试这个模式:

    SELECT Id, ProductName, ManufactureDate
    FROM (
        SELECT Id, ProductName, ManufactureDate, MAX(ManufactureDate)OVER() AS MaxManufactureDate
        FROM Product P
        ) P
    WHERE P.MaxManufactureDate = P.ManufactureDate
    

    本质上,使用窗口函数来获取内联视图中要查找的数据,然后使用外部查询中的 where 子句来匹配它们。

    【讨论】:

    • 这是一个更快的查询,然后首先将最大日期选择到变量中,然后在另一个查询中放入 where 子句?
    • 我建议检查您的数据集的执行计划。
    最近更新 更多