SQL:如何仅获取每个用户的第一个用户操作

Shp*_*tem 1 sql postgresql greatest-n-per-group

我有一张桌子

actions
-------
user_id
action
date
Run Code Online (Sandbox Code Playgroud)

如何仅选择每个用户的第一个操作?

示例数据(操作并不重要,让它 = 0):

  • 1 0 2014-05-01
  • 1 0 2014-05-02
  • 1 0 2014-05-03
  • 2 0 2014-05-01
  • 2 0 2014-05-02
  • 3 0 2014-05-08

预期结果:

  • 1 0 2014-05-01
  • 2 0 2014-05-01
  • 3 0 2014-05-08

小智 5

使用窗口函数(标准 SQL)可以轻松解决这个问题

select user_id, 
       action,
       date
from (
   select user_id,
          action,
          date,
          min(date) over (partition by user_id) as min_date
   from actions
) t
where date = min_date
order by user_id;
Run Code Online (Sandbox Code Playgroud)

使用窗口函数很可能比表上的自连接更快。

使用 Postgres 的distinct on运算符很可能比使用窗口函数的解决方案更快(但这不能移植到其他 DBMS)。

select distinct on (user_id) user_id, action, date
from actions
order by user_id, date
Run Code Online (Sandbox Code Playgroud)

SQLFiddle: http: //sqlfiddle.com/#!15/ ae67f/6