【问题标题】:SQL Query to return most recent row WITH an additional filterSQL 查询以返回带有附加过滤器的最新行
【发布时间】:2015-04-04 19:31:31
【问题描述】:

非常卡在我试图运行的某个查询上。

这是表结构 -

+--------+----------+--------+
| caseID | status   | update | 
+--------+----------+--------+
     1       New      3-4-2013
     1       Open     3-5-2013
     2       New      3-5-2013
     3       Closed   3-5-2013

我希望我的查询返回最近的行,然后只显示 status = 'New' 的行,即在示例数据中只应该返回行 caseID = 2。

我有这个问题

SELECT * FROM (SELECT * FROM table ORDER BY update DESC) AS foo GROUP BY caseID

该查询返回每个 caseID 的最新行。现在,我对仅显示 where status = 'New' 的部分感到震惊。

我试过了,得到 #1064 SQL 错误

`SELECT * FROM (SELECT * FROM table ORDER BY update DESC) AS foo GROUP BY caseID WHERE status = 'New'

我试过了,它会返回所有 status='New' 的行,即使它们不是最新的。这不是我想要的。

SELECT * FROM (SELECT * FROM table ORDER BY update DESC) AS foo WHERE status = 'New' GROUP BY caseID

提前感谢您的帮助。

【问题讨论】:

  • 请用您正在使用的特定 RDBMS 标记您的问题。
  • select caseId, status, max('update') as 'update' from table where status = 'New'

标签: mysql sql


【解决方案1】:

使用group by 查找最近行的日期,然后使用join 和过滤器:

select s.*
from structure s join
     (select caseId, max(update) as maxupdate
      from structure s
      group by caseid
     ) ss
     on s.caseId = ss.caseId and s.update = ss.maxupdate
where s.status = 'New';

【讨论】:

    【解决方案2】:

    这样的事情应该可以工作。

    select * from data
      join (select caseId, max(`update`) as 
               `update` from data 
               where status = 'New' 
               group by caseId) as filter
         on filter.caseId = data.caseId and filter.`update` = data.`update`
    where data.status = 'New'
      group by data.caseId;
    

    基本上,您将表连接到自身,但内部连接识别您尝试检索的最新记录。

    Link to SQL Fiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多