【问题标题】:How to find the latest row for each group of data如何查找每组数据的最新行
【发布时间】:2010-05-13 02:08:04
【问题描述】:

我有一个棘手的问题,我正在努力寻找最有效的方法来解决。

这是我的视图结构的简化版本。


表:审核

审计ID |出版物ID |审计结束日期 |审计开始日期 1 | 3 | 13/05/2010 | 2010 年 1 月 1 日 2 | 1 | 2009 年 12 月 31 日 | 2009 年 1 月 10 日 3 | 3 | 2010 年 3 月 31 日 | 2010 年 1 月 1 日 4 | 3 | 2009 年 12 月 31 日 | 2009 年 1 月 10 日 5 | 2 | 2010 年 3 月 31 日 | 2010 年 1 月 1 日 6 | 2 | 2009 年 12 月 31 日 | 2009 年 1 月 10 日 7 | 1 | 2009 年 9 月 30 日 | 2009 年 1 月 1 日

我需要 3 个查询。我需要一个来获取所有数据。接下来只获取历史数据(即除AuditEndDate最新数据项之外的所有数据),然后最后一个查询是获取最新数据项(通过AuditEndDate)。

我有一个日期限制(这是基于每个用户/组),其中某些用户组只能在某些日期之间看到,这增加了一层复杂性。您会在 where 子句中注意到这一点,即 AuditEndDate=blah

Foreach 发布,选择所有可用数据。

select * from Audits
Where auditEndDate<='31/03/10' and AuditStartDate>='06/06/2009';

对于每个发布,选择所有数据,但排除可用的最新数据(按 AuditEndDate)

select * from Audits 
left join 
(select AuditId as aid, publicationID as pid
   and max(auditEndDate) as pend 
 from Audit where auditenddate <= '31/03/2009' /* user restrict */
 group by pid) Ax 
on Ax.pid=Audit.pubid
where pend!=Audits.auditenddate
AND auditEndDate<='31/03/10' 
and AuditStartDate>='06/06/2009' /* user restrict */

对于每个发布,仅选择可用的最新数据(按 AuditEndDate)

select * from Audits 
left join 
  (select AuditId as aid, publicationID as pid
    and max(auditEndDate) as pend 
   from Audit where auditenddate <= '31/03/2009'/* user restrict */
   group by pid) Ax 
on Ax.pid=Audit.pubid
where pend=Audits.auditenddate
AND auditEndDate<='31/03/10' 
and AuditStartDate>='06/06/2009' /* user restrict */

所以目前,查询 1 和 3 工作正常,但查询 2 只返回所有数据而不是限制。

谁能帮帮我?

谢谢

杰森

【问题讨论】:

    标签: mysql date group-by aggregate database-partitioning


    【解决方案1】:

    好的,实际上...这些查询工作正常。这是我运行它们的条件 PHP。 一切都好:)

    任何可以为此提出更有效方法的人,尽管我很想听听。我最初在 where 子句中使用子查询,运行速度非常慢......从 2 秒到 50 秒......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-06
      • 2016-08-29
      相关资源
      最近更新 更多