SQL查询:为每个不同的字段值选择最近的条目?

时间:2011-01-18 17:19:15

标签: sql

我有这张桌子位置:

CREATE TABLE `position` (
  `idposition` bigint(20) NOT NULL AUTO_INCREMENT,
  `latitude` varchar(45) DEFAULT NULL,
  `longitude` varchar(45) DEFAULT NULL,
  `timestamp` datetime DEFAULT NULL,
  `fk_email` varchar(100) DEFAULT NULL,

有这个人口:

idposition  latitude    longitude   timestamp              fk_email
        1   39.49333    -0.33667    2010-12-10 17:15:39     david@test.es
         4  39.47333    -0.36167    2010-12-11 09:58:47     ronald@test.es
         5  39.50333    -0.34267    2010-12-10 21:11:10     david@test.es
        10  39.44333    -0.41667    2010-12-12 18:17:26     fanny@test.es
        11  39.45199    -0.31967    2010-12-12 21:01:18     victor@test.es
        12  39.52133    -0.36167    2010-12-12 17:43:11     carlos@test.es
        13  39.43199    -0.31967    2010-12-14 15:45:25     victor@test.es
        14  39.41199    -0.34567    2010-12-14 20:46:09     victor@test.es
        15  39.43433    -0.41667    2010-12-14 17:29:39     maria@test.es
        16  39.44133    -0.42667    2010-12-12 19:17:33     maria@test.es
        17  39.50333    -0.35667    2010-12-13 16:36:22     angel@test.es
        196     39.46454    -0.38978    0000-00-00 00:00:00     fanny@test.es
        271     33.63883    -0.45024    2010-12-17 11:36:45     fanny@test.es
        273     39.46680    -0.39452    2010-12-20 00:00:00     fanny@test.es
        441     39.44133    -0.41467    2010-12-15 17:45:13     carlos@test.es
        5326    39.47316    -0.38351    2011-01-18 18:09:56     pablo@upv.es
好吧,我想制作SQL查询,它返回给我每个FK_EMAIL的最后(最新)位置,我的意思是,对于每个fk_email,最后一个(最新)timestamp的位置,每封电子邮件只有一个位置(最后一个)。

有可能吗?有人可以帮我查询吗?对我来说太难了

3 个答案:

答案 0 :(得分:5)

SELECT  
      p.idposition, 
      p.atitude, 
      p.longitude, 
      p.timestamp, 
      p.fk_email

FROM  
      position p 
      INNER JOIN (select 
              fk_email,
              max(timestamp) timestamp
                 FROM    POSITION 
                 GROUP BY  fk_email) lastPos 
      ON p.fk_email = lastPos.fk_email and p.timeStamp = lastpos.timestamp

这个问题的一个潜在问题是,如果为同一个fk_email记录了相同的时间戳,您将获得两个结果。如果这两个列的组合存在唯一约束,您不必担心这一点。

<强>更新 来自评论

  

但有一个问题更多,唯一   可能会返回两行   每封电子邮件都是有名的   两行中的时间戳相同   电子邮件?我怎么能逃避那个

正如我之前所说,在两个字段上添加一个唯一约束,所以它不会发生是最简单的。但是我们假设您不能这样做,并且还假设时间戳是相同的。你需要选择任意行作为“正确的”行。

假设IdPosition是唯一的,你可以这样做

SELECT 
     p.idposition, 
      p.atitude, 
      p.longitude, 
      p.timestamp, 
      p.fk_email
  FROM 
   position p
    INNER JOIN (SELECT  
                    max(p.idposition) idposition
              FROM  
                    position p 
                    INNER JOIN (select 
                            fk_email,
                            max(timestamp) timestamp
                               FROM    POSITION 
                               GROUP BY  fk_email) lastPos 
                    ON p.fk_email = lastPos.fk_email and p.timeStamp = lastpos.timestamp
              GROUP BY 
                     fk_email) lastpos
              on p.idposition = lastpos.idposition

答案 1 :(得分:4)

试试这个:

select * from
(select idposition, latitude, longitude, timestamp, fk_email, row_number() over(partition by fk_email order by timestamp desc) as rownumber
from position
) derived
where rownumber = 1

答案 2 :(得分:1)

SELECT idposition, atitude, longitude, timestamp, fk_email 
FROM   position 

GROUP BY fk_email HAVING MAX( timestamp )