【问题标题】:How to count tags by user in a day如何在一天内按用户计算标签
【发布时间】:2012-11-09 17:01:43
【问题描述】:

我有一个跟踪用户创建的标签的表。我相信这个问题的重要列是 user_id(谁制作了标签)和 created_at。

通过一些搜索,我发现了如何使用 date_trunc 将 created_at 转换为一天,以便我们可以按此分组。

但是,我只能得到这个来计算一天的总标签数。我想做的是按用户和日期分组,这样我就可以看到每个用户每天创建了多少标签,并通过一些排序找出用户在一天中创建的标签数量最多。

我正在使用 postgres 9.1.6。

有什么帮助吗?提前致谢。

编辑:我开始的主要是在黑暗中拍摄,是:

select user_id,
       date_trunc('day', created_at) as "Day",
       count(*) as "numtags"
  from tags
  group by user_id, created_at
  order by numtags desc;

结果是:

 user_id |         Day         | numtags 
---------+---------------------+---------
      1  | 2012-01-08 00:00:00 |    5719
      1  | 2012-01-31 00:00:00 |    3239
      1  | 2011-12-01 00:00:00 |    1868
      1  | 2011-12-01 00:00:00 |    1772
      1  | 2011-12-01 00:00:00 |    1756

很明显,分组没有按预期工作,用户 ID 都是相同的(我已经手动确认它们不应该是)。

我想看看类似的东西(上面的数字不匹配,只是一个例子):

 user_id |         Day         | numtags 
---------+---------------------+---------
      1  | 2012-01-08 00:00:00 |    100
      4  | 2012-01-31 00:00:00 |    90
      1  | 2011-12-12 00:00:00 |    80
      2  | 2011-12-12 00:00:00 |    77
      2  | 2011-12-13 00:00:00 |    76

即同一个用户会出现很多次,同一个日期会出现很多次——实际上每个 user_id/Day 组合都会出现(每个一次),只要用户在一天中至少创建了一个标签,numtags 会显示有多少标签是该用户在当天制作的。

【问题讨论】:

  • 添加查询以开始和/或预期结果。现在我只能建议按 user_id 添加组,created_at::date order by count(*) desc

标签: sql postgresql


【解决方案1】:

按照我的建议:

select user_id,
   created_at::date as "Day",
   count(*) as "numtags"
from tags
group by user_id, created_at::date
order by numtags desc;

created_at::date 将时间戳转换为日期类型。

您的错误是按 createdate 分组,它是具有不同时间部分的时间戳,但结果您截断了时间戳。

【讨论】:

  • 嗯,这很奇怪,因为我最初使用“group by user_id, 2”,我只是为帖子更改了它,但它看起来不正确。不过还是谢谢。
猜你喜欢
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 2018-02-13
  • 2016-03-06
  • 1970-01-01
相关资源
最近更新 更多