【问题标题】:How to get MAX() value and Record Primary Key where the value occurs in a Database?如何获取 MAX() 值并记录数据库中出现该值的主键?
【发布时间】:2021-10-17 11:17:43
【问题描述】:

我有一个数据库,其中Hoursinteger 字段,PKrecord ID/Autonumber 在表中标识记录。如何使用 SQL 查询获取最大值以及最大值所在的记录 ID 或字段值? 我正在使用.mdb MS Access 数据库。

我目前使用的代码:

        with dmpat.ADOQuery1 do
        begin
          sql.Clear; //Hours is integer field
          //Here I would like to get the ID (integer) field value of each of these values:
          sql.Add('SELECT MAX(Hours) AS [Max], MIN(Hours) AS [Min], AVG(Hours) AS [AVE]');
          sql.Add('FROM Professions');
          open;

          Max := fields[0];
          Min := fields[1];
          Ave := fields[2];
        end;

这样的事情可能吗? SQL 新手,谢谢!

【问题讨论】:

  • 用您使用的数据库标记您的问题。
  • 确保您的 Sql 允许多个记录具有最大值和最小值。
  • @MartynA 我该怎么做?
  • 看看@forpas 怎么说。就个人而言,由于重复/乘法的问题,我不会尝试在单个查询中获取所有这些值。
  • 一般的解决方案是发出3个查询:1)获取最小值和最大值2)获取具有最小值的记录2)获取具有最大值的记录

标签: sql delphi ms-access-2007


【解决方案1】:

所以我找到了这个解决方案。这将给出Primary Key 或记录ID。它还允许存在多个具有MAX()MIN() 值的记录。

SELECT ID, Name, Hours AS [Max] FROM Professions
    WHERE Hours = (SELECT MAX(Hours) FROM Professions)
    ORDER BY ID ASC

这里是使用另一个数据库的证明,尽管同样的概念也适用。

我实际上是在处理一个完全不同的问题时编写这段代码的。

【讨论】:

  • @MartynA 这会是一个合适的改进吗?
  • 您希望结果中的最小值和平均值在哪里?
  • @forpas 非常感谢您的回答。但是,我的问题只是想要这些值及其关联的 ID。这些值不必都在一个查询中。
  • 在您的问题中,您说:在这里我想获取每个值的 ID(整数)字段值:...
  • 您的意思是您更喜欢执行 3 个单独的查询来获取所有 3 个值而不是仅 1 个查询?
【解决方案2】:

您可以使用 2 个子查询:

SELECT MAX(Hours) AS [Max],
       (SELECT TOP 1 ID FROM Professions ORDER BY Hours DESC) AS Max_ID, 
       MIN(Hours) AS [Min], 
       (SELECT TOP 1 ID FROM Professions ORDER BY Hours) AS Min_ID,
       AVG(Hours) AS [AVE]
FROM Professions

每个子查询按降序或升序对表格进行排序,并选择最上面的一行。

【讨论】:

  • 查看我对 q 的评论。
  • @MartynA 如果有 2 行或更多行具有相同的最大或最小小时数,则查询将选择 1 作为 max_id 和 1 作为 min_id。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多