如何通过postgresql

时间:2017-01-03 15:24:58

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

我想找一个用他的anonymous_id和时间戳注册我的产品(带有id)的用户的第一个条目。

因为我知道已经注册并且已经注册的用户再次访问该页面,可以有多个anonymous_id(f.e使用多个设备,有新的cookie等...),我区分user_id

我写了一个看起来像这样的代码

SELECT distinct user_id , min(timestamp),anonymous_id
FROM data
group by 1,3

但现在他给了我所有第一次提到用户的所有anonymous_id

user_id | timestamp                   | anonymous_id
 ------ | ----------------------------|-------------
 12     |  2016-07-28 16:19:57.101+00 | x-1
 ------ | ----------------------------|-------------
 12     | 2016-08-24 09:17:21.294+00    y-23 
 12     | 2016-07-27 12:03:25.572+00    y-2345 

我只想看到第一次提到user_id 12 - 在这种情况下是带有时间戳的那个2016-07-27 12:03:25.572 + 00

我是如何编写代码的,所以我第一次提到了user_id?

2 个答案:

答案 0 :(得分:1)

Postgres中最快的方法是使用其专有的distinct on ()

SELECT distinct on (user_id) user_id , timestamp, anonymous_id
FROM data
order by user_id, timestamp;

答案 1 :(得分:0)

您可以使用row_number()窗口功能:

SELECT user_id, timestamp, anonymous_id
FROM   (SELECT user_id, timestamp, anonymous_id,
               ROW_NUMBER() OVER (PARTITION BY user_id
                                  ORDER BY timestamp ASC) AS rn
        FROM   data) t
WHERE  rn = 1