从按特定字段分组的日期列中获取最大值

时间:2011-01-17 13:51:06

标签: sql aggregate-functions join

我有一张类似的表:

LogId  RefId   Entered
==================================
1      1       2010-12-01
2      1       2010-12-04
3      2       2010-12-01
4      2       2010-12-06
5      3       2010-12-01
6      1       2010-12-10
7      3       2010-12-05
8      4       2010-12-01

这里,LogId是唯一的;对于每个RefId,有多个带时间戳的条目。我想要提取的是每个最新的RefId的LogId。

我尝试了以下链接的解决方案:http://stackoverflow.com/questions/121387/sql-fetch-the-row-which-has-the-max-value-for-a-column。但是,它返回具有相同RefId的多行。 LogId和RefId应该是唯一的。

有人可以帮我这个吗?

由于

Vamyip

3 个答案:

答案 0 :(得分:3)

您需要使用一个子查询来提取每个RefId的最新输入值,然后将您的源表连接到RefId,输入:

SELECT DISTINCT MyTable.LogId, MyTable.Entered FROM MyTable
INNER JOIN (SELECT RefId, MAX(Entered) as Entered FROM MyTable GROUP BY RefId) Latest
ON MyTable.RefId = Latest.RefId AND MyTable.Entered = Latest.Entered

答案 1 :(得分:0)

由于它显示自动增加日志ID,因此它们将按顺序标记日期/时间。因此,通过获取每个参考ID的最后一个LogID,您将在下面的“PreQuery”中获得“最新”,然后根据该单个ID加入原始表以获取实际日期戳信息(或其他详细信息) )你需要从实际的日志。

select PreQuery.RefID,
       PreQuery.LastLogEntry,
       L.Entered
   from 
      ( select RefID,
               Max( LogID ) LastLogEntry
           from 
               YourLog
           group by
               RefID ) PreQuery,
      YourLog L
   where
      PreQuery.LastLogEntry = L.LogID

答案 2 :(得分:0)

正确处理重复项:

SELECT  m.*
FROM    (
        SELECT  DISTINCT refid
        FROM    mytable
        ) md
JOIN    mytable m
ON      m.LogID = 
        (
        SELECT  LogID
        FROM    mytable mi
        WHERE   mi.refid = md.refid
        ORDER BY
                mi.refid DESC, mi.entered DESC, mi.logid DESC
        LIMIT 1
        )

mytable (refid, entered, logid)上创建一个索引,以便快速工作。