获取最近两天不同用户ID的数量

问题描述 投票:0回答:2

比方说这张桌子的最近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
sql postgresql amazon-redshift distinct aggregate-functions
2个回答
1
投票

经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

  • 关于标识符的大写:


  • 0
    投票
    您可以使用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
    
    © www.soinside.com 2019 - 2024. All rights reserved.