获取最近几天不同用户 ID 的计数
Posted
技术标签:
【中文标题】获取最近几天不同用户 ID 的计数【英文标题】:Get the count of distinct userids for last couple of days 【发布时间】:2020-06-01 13:51:59 【问题描述】:假设这张表的最后 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
【问题讨论】:
对于Download_time
,计数应该是 1 对吧?是不是打错字了?
是的,对不起....更正了。
【参考方案1】:
用 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小提琴here
CURRENT_DATE
是标准 SQL,适用于 Postgres 和 Redshift。相关:
关于“过去 7 天”:我用了过去 7 天整天(今天不包括 - 必然不完整),语法可以在 (download_time)
上使用普通索引。相关:
Get dates of a day of week in a date range
Slow LEFT JOIN on CTE with time intervals
Interval (days) in PostgreSQL with two parameters理想情况下,您在(download_time, userid)
上有一个复合索引(并满足一些先决条件)以获得非常快的index-only scans。见:
count(DISTINCT ...)
通常很慢。对于有很多重复的大表,有更快的技术。如果您需要优化性能,请披露您的确切设置和基数。
如果实际数据类型是timestamptz
,而不仅仅是timestamp
,您还需要定义定义日期边界的时区。见:
关于可选短语法GROUP BY 2
:
关于标识符的大小写:
Are PostgreSQL column names case-sensitive?【讨论】:
发现它很有见地。谢谢 now()::date 在 redshift 中不起作用 ....getdate() 将在这里起作用。 @ashwini571:我切换到CURRENT_DATE
,两者都适用。见上文。【参考方案2】:
您可以使用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
Fiddle
【讨论】:
以上是关于获取最近几天不同用户 ID 的计数的主要内容,如果未能解决你的问题,请参考以下文章