获取最近几天不同用户 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。相关:

How do I determine the last day of the previous month using PostgreSQL?

关于“过去 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。见:

Is a composite index also good for queries on the first field?

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

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

Ignoring time zones altogether in Rails and PostgreSQL

关于可选短语法GROUP BY 2

Select first row in each GROUP BY group?

关于标识符的大小写:

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 的计数的主要内容,如果未能解决你的问题,请参考以下文章

一周内不同的日期计数

Snowflake - 在使用窗框或订单时获取不同用户的计数

从 mysql 表中的同一列获取计数?

mongodb上的sql查询以获取多列的计数与单列的id值

总和和不同计数措施(星型模式设计公案)

来自同一模型的多个模型的计数关系