Postgres:需要获得最小值的第一行(datecreated)

时间:2015-09-15 12:23:50

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

我需要帮助.. 我有一张下面的表格。我需要获得日期创建列

的最小值的整行
  id      group    users       datecreated
  ===========================================
 *39583 | group1 | user1 | 7/6/2015 23:28
  39583 | group1 | user1 | 7/6/2015 23:37
  39583 | group1 | user2 | 7/7/2015 15:27
  39583 | group1 | user2 | 7/7/2015 19:39
  39583 | group1 | user3 | 7/7/2015 22:17
  39583 | group1 | user4 | 7/8/2015 19:18
  39583 | group1 | user3 | 7/9/2015 2:35
  39583 | group1 | user5 | 7/9/2015 14:19
 *39123 | group1 | user5 | 7/5/2015 14:19
  39123 | group1 | user1 | 7/5/2015 23:28
  39123 | group1 | user1 | 7/5/2015 23:37
  39123 | group1 | user2 | 7/5/2015 15:27
  39123 | group1 | user2 | 7/6/2015 19:39
  39123 | group1 | user3 | 7/6/2015 22:17
  39123 | group1 | user4 | 7/6/2015 19:18
  39123 | group1 | user3 | 7/7/2015 2:35
  39123 | group1 | user5 | 7/7/2015 14:19
  39123 | group1 | user5 | 7/7/2015 14:19

我希望在postgres中获得以下行...

id    group    users       datecreated
===========================================
39583   | group1 | user1 | 7/6/2015 23:28
39123   | group1 | user5 | 7/5/2015 14:19

3 个答案:

答案 0 :(得分:1)

您可以使用row_number来获得所需的结果。

select id, group, users, datecreated from
(
select *, row_number() over(partition by id order by datecreated) as rn
from tablename
) t 
where t.rn = 1;

答案 1 :(得分:0)

您可以执行GROUP BY并使用主表执行JOIN,例如

select t.id,      
t.group,    
t.users,       
t.datecreated
from table1 t join (
select min(datecreated) as mindatecreated, id
from table1
group by id) xx 
on t.id = xx.id and t.datecreated = xx.mindatecreated;

答案 2 :(得分:0)

使用Postgres'distinct on()通常比使用窗口函数的解决方案更快(两者通常比具有子选择的解决方案更快)

select distinct on (id) id, "group", users, datecreated
from the_table
order by id, datecreated;

请注意group是保留关键字,不能用作列名without quoting