【问题标题】:Postgres: Need to get the first row with minimum value for (datecreated)Postgres:需要获取(datecreated)最小值的第一行
【发布时间】:2015-09-15 12:23:50
【问题描述】:

我需要帮助.. 我在下面有一个表格.. 我需要获取 datecreated 列的最小值的整行

  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

【问题讨论】:

  • 你用什么逻辑只得到那 2 行?为什么包含 user2..4 的行被排除在外?
  • 需要获得每个 ID 的第一次出现...

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


【解决方案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;

【讨论】:

    【解决方案2】:

    您可以执行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;
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-12
        • 1970-01-01
        • 2019-03-09
        • 1970-01-01
        • 1970-01-01
        • 2018-01-29
        • 1970-01-01
        相关资源
        最近更新 更多