计算每个时间段的第一个记录

时间:2017-06-16 22:25:11

标签: sql postgresql

在我的表trips中,我有两列:created_atuser_id

独特的用户需要多次旅行。我的目标是计算每年每user_id个月唯一的第一次行程。我了解在这种情况下应该应用min()函数。

在之前的查询中,汇总了每年每月的所有唯一身份用户:

SELECT to_char(created_at, 'YYYY-MM') as yyyymm, COUNT(DISTINCT user_id)
FROM trips
GROUP BY yyyymm
ORDER BY yyyymm;

上述查询中的哪个位置应该min()进行整合?换句话说,我不需要计算每月唯一用户ID的第一次出现,而不是计算每月的所有唯一用户ID。

示例输入如下:

> routes
   user_id          created_at
1        1 2015-08-07 07:18:21
2        2 2015-05-06 20:43:52
3        3 2015-05-06 20:53:54
4        1 2015-03-30 20:09:07
5        2 2015-10-01 18:28:32
6        3 2015-08-07 07:29:29
7        1 2015-08-28 13:45:44
8        2 2015-08-07 07:37:31
9        3 2015-03-30 20:14:04
10       1 2015-08-07 07:08:50

输出结果为:

   count     Y-m   
1        0 2015-01 
2        0 2015-02 
3        2 2015-03
4        0 2015-04 
5        1 2015-05

因为user_id 1和3的第一次出现是在3月份,而user_id 2的第一次出现是在5月份

1 个答案:

答案 0 :(得分:4)

您可以使用2级聚合执行此操作。获取每个user_id的min时间,然后count

SELECT to_char(first_time, 'YYYY-MM'),count(*)
from (
SELECT user_id,MIN(created_at) as first_time
FROM trips
GROUP BY user_id
) t
GROUP BY to_char(first_time, 'YYYY-MM')