1

给定一个像这样的用户表:

用户:id、created_at

如何获取按天分组的用户数?我的目标是查看本周一创建的用户数量与上周一的相比。

4

4 回答 4

1
SELECT COUNT(id) AS cnt, EXTRACT(DOW FROM created_at) AS dow
FROM Users
GROUP BY EXTRACT(DAY FROM created_at)
于 2013-07-22T23:33:28.953 回答
1

如果created_at是 type timestamp,最简单和最快的方法是简单地转换为date

SELECT created_at::date AS day,  count(*) AS ct
FROM   users
GROUP  BY 1;

因为我假设id不可能NULL,比 ,count(*)短一点和快一点count(id),同时做同样的事情。

如果您只想查看“上周一”以来的天数:

SELECT created_at::date,  count(*) AS ct
FROM   users
WHERE  created_at >= (now()::date - (EXTRACT(ISODOW FROM now())::int + 6))
GROUP  BY 1
ORDER  BY 1;

这是精心起草的,以使用sargable条件,因此它可以使用一个简单的索引(created_at如果存在)。

考虑手册EXTRACT

于 2013-07-22T23:46:34.317 回答
0

我来自 T-SQL 背景,我会做这样的事情

    CREATE TABLE #users
(id int,
 created_at datetime
 )

INSERT INTO #users
(id, created_at)
VALUES
(
  1, getdate()
  )

INSERT INTO #users
(id, created_at)
VALUES
(
  1, getdate()
  )


INSERT INTO #users
(id, created_at)
VALUES
(
  1, dateadd(DAY, 1,getdate())
  )

SELECT id, created_at, count(id) FROM #users
GROUP BY id, created_at

DROP TABLE #users

如果您只按日期部分而不是整个日期时间值分组,您将获得更好的结果。

进入第二部分 - 仅比较星期一;你可以使用类似的东西

select datename(dw,getdate())

以上将为您提供工作日的名称,您可以将其与字符串文字“星期一”进行比较。

于 2013-07-22T23:55:43.407 回答
0

如果您想查看日期,请使用to_char(<date>, 'Day').

所以,一种做你想做的事情的方法:

select date_trunc('day', created_at), count(*)
from users u
where to_char(created_at, 'Dy') = 'Mon'
group by date_trunc('day', created_at)
order by 1 desc;

也许更一般的看待它的方法是按星期几、本周和上周总结结果。就像是:

select to_char(created_at, 'Day'),
       sum(case when created_at >= current_date - 6 then 1 else 0 end) as ThisWeek,
       sum(case when trunc(created_at) between current_date - 13 and current_date - 7 then 1 else 0 end) as LastWeek
from users u
group by to_char(created_at, 'Day')
于 2013-07-22T23:36:03.283 回答