用于检索最新行的SQL

时间:2014-03-29 22:14:39

标签: sql select group-by

必须是一项相当普遍的任务,但我无法找到一种优雅的方法。

表:

Id  
testdate  
partid  
testid

同一部分可能会多次进行相同的测试。我想要(partlist)中所有部分的所有测试的最新结果。

SELECT max(testdate) 
FROM table 
WHERE partid IN (partlist) 
GROUP BY testid, partid

除了它没有给我所需的id字段外,几乎可以完成这项工作。我可以先选择正确的日期,然后在WHERE子句中使用testdate,partid和testid选择id字段,但这有点难看。

必须有更好的方法吗?

如果需要,我愿意放弃部件清单并一次只获取一部分数据。

2 个答案:

答案 0 :(得分:1)

优雅。然后有效率。在优雅方面,row_number()功能可以提供帮助。

就效率而言,not exists方法似乎在许多数据库中都运行良好:

SELECT t.*
FROM table t
WHERE partid IN (partlist) AND
      NOT EXISTS (SELECT 1
                  FROM table t2
                  WHERE t2.testid = t.testid and t2.partid = t.partid and
                        t2.testdate > t.testdate
                 );

它说:“从表格中获取所有行,其中没有另一行具有相同的testidpartid但具有更大的testdate。”

答案 1 :(得分:1)

您没有说明您的DBMS,因此这是ANSI SQL:

select id, 
       max_testdate,
       partid,
       testid
from (
  select Id,
         testdate,
         max(testdate) over (partition by testid, partid) as max_testdate
         partid  
         testid
  from the_table
) t
where testdate = max_testdate