【问题标题】:Get the latest date from grouped MySQL data从分组的 MySQL 数据中获取最新日期
【发布时间】:2012-01-18 05:03:14
【问题描述】:

我的数据库中有以下数据:

|NO | model | date     | 
+---+-------+----------+
|1  | bee   |2011-12-01|
|2  | bee   |2011-12-05|
|3  | bee   |2011-12-12|
|4  | tar   |2011-12-13|

我想获取每个模型组的最新日期:

| model | date     | 
+-------+----------+
| bee   |2011-12-12|
| tar   |2011-12-13|

我试过了:

SELECT model, date 
FROM doc
WHERE date ........????? //what is the next?
GROUP BY model

【问题讨论】:

    标签: mysql sql date greatest-n-per-group


    【解决方案1】:

    您可以尝试在子查询中使用 max(),如下所示:

    SELECT model, date  
    FROM doc 
    WHERE date in (SELECT MAX(date) from doc GROUP BY model);
    

    【讨论】:

    • 由于GROUP BY 是获取所有记录的必要条件,因此这应该是公认的答案。
    • 考虑数据集,('foo', '2019-10-01'), ('foo', '2019-10-10'), ('bar', '2019-10-01') 在子选择中使用 GROUP BY 会为“2019-10-01”返回不需要的 foo 行,因为它与 bar max 匹配的日期相同日期。
    【解决方案2】:

    试试这个:

    SELECT model, date
    FROM doc
    WHERE date = (SELECT MAX(date)
    FROM doc GROUP BY model LIMIT 0, 1)
    GROUP BY model
    

    【讨论】:

      【解决方案3】:

      您是否正在寻找每个模型的最大日期?

      SELECT model, max(date) FROM doc
      GROUP BY model
      

      如果您要查找与整个表格的最大日期匹配的所有模型...

      SELECT model, date FROM doc
      WHERE date IN (SELECT max(date) FROM doc)
      

      [--- 已添加 ---]

      对于那些想要显示与每个模型组中的最新日期匹配的每条记录的详细信息(不是摘要数据,如 OP 中所要求的):

      SELECT d.model, d.date, d.color, d.etc FROM doc d
      WHERE d.date IN (SELECT max(d2.date) FROM doc d2 WHERE d2.model=d.model)
      

      MySQL 8.0 和更新版本支持OVER 子句,对于更大的数据集产生相同的结果更快。

      SELECT model, date, color, etc FROM (SELECT model, date, color, etc, 
        max(date) OVER (PARTITION BY model) max_date FROM doc) predoc 
      WHERE date=max_date;
      

      【讨论】:

      • 我认为正确的sql应该是:SELECT model, date FROM doc WHERE date IN (SELECT max(date) FROM doc group by model),最后应该加上group by。
      • 如果表格中有其他列,您将需要这个。 stackoverflow.com/questions/612231/…
      • 我在尝试SELECT model, date FROM doc GROUP BY model ORDER BY date DESC,但这里的顺序似乎被忽略了。
      • 考虑按型号分组意味着什么。您要求查询将与每个模型匹配的多个日期合并到一个条目中。您需要指定一个类似 MIN(date) 或 MAX(date) 的函数来确定显示与模型相关的众多日期中的哪一个日期。
      • 使用 max(date) 并没有解决我的问题,因为无法保证其他列与 max(date) 来自同一行。
      【解决方案4】:

      这应该可行:

      SELECT model, date FROM doc GROUP BY model ORDER BY date DESC
      

      它只是将日期从最后一个到第一个排序,并且通过分组它只抓取第一个。

      【讨论】:

      • 这是不正确的,如果您使用 GROUP BY 模型,您必须在 select 中的其他列上应用聚合函数。
      【解决方案5】:

      子查询给出日期。我们没有与模型链接。所以下面的查询解决了这个问题。

      如果有重复的日期/型号可以通过下面的查询来避免。

      select t.model, t.date
      from doc t
      inner join (select model, max(date) as MaxDate from doc  group by model)
      tm on t.model = tm.model and t.date = tm.MaxDate
      

      【讨论】:

        【解决方案6】:

        为什么不使用这个呢?

        SELECT model, date FROM doc ORDER BY date DESC LIMIT 1
        

        【讨论】:

        • 你不会得到使用它的最大或最晚日期。只是对日期进行排序
        • 如果我按降序对日期进行排序,然后只得到第一个,那么我有最新的日期。
        • 是的,当然。但我想做的是显示每个模型的最大日期。所以我不需要展示很多记录。
        • 另外,mysql 上有一个严重的错误,即“order by <..> desc limit 1”
        【解决方案7】:

        使用 max(date) 并没有解决我的问题,因为无法保证其他列与 max(date) 来自同一行。而不是这个解决了我的问题,并以正确的顺序对分组进行了排序,其他列的值与最大日期来自同一行:

        SELECT model, date 
        FROM (SELECT * FROM doc ORDER BY date DESC) as sortedTable
        GROUP BY model
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-02-04
          • 2022-11-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-16
          • 2015-11-07
          相关资源
          最近更新 更多