按星期一分组的用户数

时间:2013-07-22 23:30:48

标签: sql postgresql

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

用户:id,created_at

如何获得按天分组创建的用户数?我的目标是查看本周一创建的用户数与上周一的用户数。帮助赞赏。感谢

4 个答案:

答案 0 :(得分:1)

SELECT COUNT(id) AS cnt, EXTRACT(DOW FROM created_at) AS dow
FROM Users
GROUP BY EXTRACT(DAY FROM created_at)

答案 1 :(得分:1)

如果created_at的类型为timestamp,则最简单,最快捷的方式是date的简单投射:

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

由于我假设id不能NULLcount(*)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的手册。

答案 2 :(得分: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')

答案 3 :(得分: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())

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

如果上述内容有帮助,请告诉我们。)