给定一个像这样的用户表:
用户:id,created_at
如何获得按天分组创建的用户数?我的目标是查看本周一创建的用户数与上周一的用户数。帮助赞赏。感谢
答案 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
不能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
的手册。
答案 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())
上面的内容将为您提供工作日的名称,您可以将其与字符串文字“星期一”进行比较。
如果上述内容有帮助,请告诉我们。)