必须是一项相当普遍的任务,但我无法找到一种优雅的方法。
表:
Id
testdate
partid
testid
同一部分可能会多次进行相同的测试。我想要(partlist)中所有部分的所有测试的最新结果。
SELECT max(testdate)
FROM table
WHERE partid IN (partlist)
GROUP BY testid, partid
除了它没有给我所需的id字段外,几乎可以完成这项工作。我可以先选择正确的日期,然后在WHERE子句中使用testdate,partid和testid选择id字段,但这有点难看。
必须有更好的方法吗?
如果需要,我愿意放弃部件清单并一次只获取一部分数据。
答案 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
);
它说:“从表格中获取所有行,其中没有另一行具有相同的testid
和partid
但具有更大的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