首页 > 解决方案 > 获取最近几天不同用户 ID 的计数

问题描述

假设这张表的最后 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

标签: sqlpostgresqlamazon-redshiftdistinctaggregate-functions

解决方案


用 PostgreSQL 测试。您还标记了很久以前在 Postgres 8.2 中分叉的 Redshift。可能有偏差..

由于您似乎对标准 ISO 格式感到满意,因此迄今为止的简单转换将是最有效的:

SELECT count(DISTINCT userid) AS "Count"
     , download_time::date AS "Download_Day"
FROM   tbl
WHERE  download_time >= CURRENT_DATE - 7
AND    download_time <  CURRENT_DATE
GROUP  BY 2;

db<>在这里摆弄

CURRENT_DATE是标准 SQL,适用于PostgresRedshift。有关的:

关于“最后 7 天”:我花了最后 7天(今天不包括 - 不一定不完整),语法可以在(download_time). 有关的:

理想情况下,您有一个复合索引(download_time, userid)(并满足一些先决条件)以获得非常快速的仅索引扫描。看:

count(DISTINCT ...)通常很慢。对于有很多重复的大表,有更快的技术。如果您需要优化性能,请披露您的确切设置和基数。

如果实际数据类型timestamptz不仅仅是timestamp,您还需要定义定义日期边界的时区。看:

关于可选的短语法GROUP BY 2

关于标识符的大写:


推荐阅读