给定一个像这样的用户表:
用户:id、created_at
如何获取按天分组的用户数?我的目标是查看本周一创建的用户数量与上周一的相比。
SELECT COUNT(id) AS cnt, EXTRACT(DOW FROM created_at) AS dow
FROM Users
GROUP BY EXTRACT(DAY FROM created_at)
如果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
。
我来自 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())
以上将为您提供工作日的名称,您可以将其与字符串文字“星期一”进行比较。
如果您想查看日期,请使用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')