最大列B时SQL返回列A.

时间:2014-07-02 11:35:40

标签: sql ms-access

我有这个表,我希望返回每个MID的最新(基于最高ID)结果

╔══════╦═══════╦══════╦═════════════════════╦════════╦═════════╗
║ ID   ║  MID  ║ Call ║ Call_Timestamp      ║ Quoted ║ Outcome ║
╠══════╬═══════╬══════╬═════════════════════╬════════╬═════════╣
║ 1957 ║ 31463 ║ Yes  ║ 03/06/2014 11:55:20 ║ No     ║ Yes     ║
║ 1958 ║ 31463 ║ Yes  ║ 04/06/2014 09:43:25 ║ No     ║ No      ║
║ 1959 ║ 31671 ║ Yes  ║ 04/06/2014 10:10:08 ║ Yes    ║ No      ║
║ 1960 ║ 31671 ║ Yes  ║ 04/06/2014 10:10:25 ║ No     ║ Yes     ║
╚══════╩═══════╩══════╩═════════════════════╩════════╩═════════╝

例如我应该返回

╔══════╦═══════╦══════╦═════════════════════╦════════╦═════════╗
║ ID   ║  MID  ║ Call ║ Call_Timestamp      ║ Quoted ║ Outcome ║
╠══════╬═══════╬══════╬═════════════════════╬════════╬═════════╣
║ 1958 ║ 31463 ║ Yes  ║ 04/06/2014 09:43:25 ║ No     ║ No      ║
║ 1960 ║ 31671 ║ Yes  ║ 04/06/2014 10:10:25 ║ No     ║ Yes     ║
╚══════╩═══════╩══════╩═════════════════════╩════════╩═════════╝ 

谢谢, 罗布

2 个答案:

答案 0 :(得分:1)

not exists查询通常是最有效的方法:

select t.*
from table t
where not exists (select 1
                  from table t2
                  where t2.mid = t.mid and
                        t2.id > t.id
                 );

这实现了逻辑:"从表中获取所有行,其中没有具有相同mid和更高id"的行。做你想做的事的一种奇特的方式。

对于性能,table(mid, id)上的索引有帮助。

答案 1 :(得分:0)

join上创建inline view idmid,然后获取匹配的记录:

select *
from   tableX t
join   ( select mid
         ,      max(id) max_id
         from   tableX
         group
         by     mid
       ) v
on     v.mid = t.mid
and    v.max_id = t.id