MySQL - 选择所有列WHERE一列是DISTINCT的最后日期

时间:2017-09-19 06:05:42

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

我有一个包含如下数据的表:Name,City,LastUpdated。我希望从表中获取所有数据的名称,但只记录上次更新的最新数据。
例如如果有2条记录
比尔,洛杉矶,2017-09-11
比尔,纽约,2017-09-19
在上面的查询应该只返回B​​ill,NY,2017-09-19记录。这样我想要所有记录名称不同但最后更新的记录是最新的(降序)。

什么sql查询可以完成这项工作?

3 个答案:

答案 0 :(得分:3)

我发布这个主要是因为其他答案/评论似乎与您需要的内容不同。如果您想获得的是与每个名称关联的最新更新,则可以使用以下简单的GROUP BY查询:

SELECT Name, MAX(LastUpdated)
FROM yourTable
GROUP BY Name

但是如果你想获得每个名字的完整最新记录(即所有列),你会遇到麻烦,因为GROUP BY只允许我们选择Name或聚合中的其他列(不是如果另一列可以由Name唯一确定,则完全正确,但通常为真。这里的规范方法是将原始表作为子查询加入到上面,并过滤除每个名称的最新行之外的所有行。

SELECT t1.*
FROM yourTable t1
INNER JOIN
(
    SELECT Name, MAX(LastUpdated) AS max_last_updated
    FROM yourTable
    GROUP BY Name
) t2
    ON t1.Name = t2.Name AND
       t1.LastUpdated = t2.max_last_updated

答案 1 :(得分:2)

这可以通过两个步骤解决:

  1. 使用last_updated_date
  2. 查找行
  3. 显示该行的所有数据。
  4. 查询可以是:

    SELECT
    t.name,
    t.city,
    t.last_updated
    FROM yourtable t
    WHERE t.last_updated = (
      SELECT MAX(s.last_updated)
      FROM yourtable s
      WHERE s.name = t.name
    );
    

答案 2 :(得分:1)

SELECT t1.*
FROM Tablename AS t1
(
   SELECT name, MAX(LastUpdated) AS LastUpdated
   FROM Tablename
   GROUP BY name
) AS t2 INNER JOIN t1.name = t2.name
               AND t1.LastUpdated = t2.LastUpdated