【问题标题】:Count first occurring record per time period计算每个时间段的第一个出现的记录
【发布时间】:2017-06-17 06:46:59
【问题描述】:

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

独特的用户进行许多不同的旅行。我的目标是计算每个 user_ids 每年每月的 第一次 行程。我知道在这种情况下应该应用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_id2 的第一次出现是在 5 月

【问题讨论】:

  • 你能展示一些示例数据和预期的输出吗?
  • 确定我已经包含了一些示例数据。

标签: sql postgresql


【解决方案1】:

您可以使用 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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 2018-11-22
    相关资源
    最近更新 更多