如何在一天内按用户计算标签

时间:2012-11-09 17:01:44

标签: sql postgresql

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

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

但是,我只能得到这个给我一天的总标签数。我想要做的是按用户和日进行分组,这样我就可以看到每个用户每天创建的标签数量,并通过一些排序来确定用户在一天中创建的标签数量是多少。< / p>

我正在使用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就会显示多少标签是由该用户在当天制作的。

1 个答案:

答案 0 :(得分:2)

正如我所说:

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正在将时间戳转换为日期类型。

你的错误是按创建时分组,这是时间戳与不同的时间部分,但结果你截断了时间戳。