【问题标题】:How to find the record in a table that contains the maximum value?如何在包含最大值的表中找到记录?
【发布时间】:2023-03-13 21:00:02
【问题描述】:

这个问题看似简单,其实有点棘手。

我有一个包含以下列的表格:

table A:
  int ID
  float value
  datetime date
  varchar(50) group

我想获取包含按“组”列分组的最大“日期”的记录的“ID”和“值”。 “每个组的最新值是多少?”

我可以得到每个组及其最大日期:

SELECT group, MAX(date) FROM A GROUP BY group; -- I also need the "ID" and "value"

但我想知道日期最高的记录的“ID”和值。

在 A 和结果之间进行 JOIN 可能是答案,但无法知道 MAX(date) 指的是哪条记录(以防“日期”重复)。

有人可以帮忙吗?

【问题讨论】:

    标签: sql datetime select group-by max


    【解决方案1】:

    您可以尝试使用子查询

    从 A 中选择组、ID、值、日期,其中日期在 ( 选择 MAX(date) 作为日期 从一个 一组一组) 按组排序

    【讨论】:

      【解决方案2】:

      这正是分析函数的用途:

      select group,
             id,
             value
      from   (
             select group,
                    id,
                    value,
                    date,
                    max(date) over (partition by group) max_date_by_group
             from A
             )
      where  date = max_date_by_group
      

      【讨论】:

        【解决方案3】:

        如果日期是唯一的,那么您已经有了答案。如果日期不是唯一的,那么您需要一些其他的唯一性。如果没有自然密钥,您的 ID 与任何密钥一样好。只需在上面加上一个 MAX(或 MIN,随你喜欢):

        SELECT *
        FROM A
        JOIN (
            --Dedupe any non unqiue dates by getting the max id for each group that has the max date
            SELECT Group, MAX(Id) as Id
            FROM A 
            JOIN (
                --Get max date for each group
                SELECT group, MAX(date) as Date 
                FROM A 
                GROUP BY group
            ) as MaxDate ON
                A.Group = MaxDate.Group
                AND A.Date = MaxDate.Date
            GROUP BY Group
        ) as MaxId ON
            A.Group = MaxId.Group
            AND A.Id= MaxId.Id
        

        【讨论】:

          【解决方案4】:

          只要日期列对于每个组都是唯一的,我认为这样的方法可能有效:

          SELECT A.ID, A.Value
          FROM A
            INNER JOIN (SELECT Group, MAX(Date) As MaxDate FROM A GROUP BY Group) B
              ON A.Group = B.Group AND A.Date = B.MaxDate
          

          【讨论】:

          • 这使得为每个组找到一条最近的记录有点困难:]
          猜你喜欢
          • 2020-02-20
          • 1970-01-01
          • 1970-01-01
          • 2015-07-04
          • 2018-07-11
          • 2011-12-02
          • 1970-01-01
          • 2015-11-07
          • 1970-01-01
          相关资源
          最近更新 更多