比方说这张桌子的最近7天:
Userid Download time
Rab01 2020-04-29 03:28
Klm01 2020-04-29 04:01
Klm01 2020-04-30 05:10
Rab01 2020-04-29 12:14
Osa_3 2020-04-25 09:01
以下是必需的输出:
Count Download_time
1 2020-04-25
2 2020-04-29
1 2020-04-30
经PostgreSQL测试。您还标记了Redshift,它是很久以前在Postgres 8.2上分叉的。可能有差异..
由于您似乎对标准ISO格式感到满意,所以迄今为止简单的转换是最有效的:
SELECT count(DISTINCT userid) AS "Count"
, download_time::date AS "Download_Day"
FROM tbl
WHERE download_time >= now()::date - 7
AND download_time < now()::date
GROUP BY 2;
db <>小提琴here
关于“过去7天”:我花了过去7天[[整个(今天不包括在内-一定是不完整的)),其语法可以在(download_time)
上使用普通索引。相关:
(download_time, userid)
上有一个复合索引(并满足一些先决条件),以获得非常快的index-only scans。参见:count(DISTINCT ...)
通常很慢。对于具有许多重复项的大表,可以使用更快的技术。如果需要优化性能,请披露您的确切设置和基数。如果实际数据类型是timestamptz
,而不仅仅是timestamp
,则还需要定义定义日期边界的时区。参见:
GROUP BY 2
:date_trunc
功能从日期时间中获取仅一天的日期并将其用于分组。查询可能是下一个:
date_trunc
SELECT
count(distinct Userid) as Count, -- get unuque users count
to_char(date_trunc('day', Download_time), 'YYYY-MM-DD') AS Download_Day -- convert time do day
FROM table
WHERE DATE_PART('day', NOW() - Download_time) < 7 -- last 7 days
GROUP BY Download_Day; -- group by day