如何在test_id上选择具有最大时间戳和结果的行

时间:2014-10-21 08:18:35

标签: sql postgresql select greatest-n-per-group

如果标题有点令人困惑,我很抱歉,但这是我的数据库表:

id  test_id   result    test_timestamp
1   5         1         2014-10-21 09:22:59
2   5         2         2014-10-21 09:25:12
3   7         3         2014-10-21 09:23:10
4   7         1         2014-10-21 09:19:51
5   7         2         2014-10-21 09:20:00

我想要做的是选择具有最新时间戳及其结果的不同test_id,结果将是:

id  test_id   result    test_timestamp
2   5         2         2014-10-21 09:25:12
3   7         3         2014-10-21 09:23:10

获取test_id和timestamp

没问题
SELECT distinct(method_id), max(test_timestamp) from results  group by method_id

但是当我想要结果时,我得到了所有可能的结果,它带有test_id的最新时间戳,我知道为什么我得到这个,但我不知道如何解决它。

SELECT distinct(method_id), max(test_timestamp), result from results  group by method_id, result

2 个答案:

答案 0 :(得分:1)

对于PostgreSQL,DISTINCT ON extension是执行此操作的最快速,最简单的方法:

SELECT DISTINCT ON (test_id)
       id, test_id, result, test_timestamp
  FROM results
 ORDER BY test_id, test_timestamp DESC, result;

答案 1 :(得分:0)

如果你不想使用PostgreSQL特殊的 distinct 语法,这里有一个简单的过滤方式:

SELECT  
id, test_id, result, test_timestamp
FROM results
where test_timestamp = (select max(test_timestamp) from results r2 where r2.test_id=results.test_id) 

http://sqlfiddle.com/#!15/f5be6/2/0

如果一个 test_id 有两行,并且具有相同的最大值 test_timestamp ,则会出现差异。然后,此SQL为此最大时间戳提供所有行,而distinct on仅提供第一个时间戳。