获取最近几天不同用户id的计数

wnvonmuf  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(248)

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

ltqd579y1#

用postgresql测试。您还标记了redshift,它在postgres8.2上分叉,很久以前。可能有差异。。
既然您似乎对标准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,适用于postgres和redshift。相关:
如何使用postgresql确定上个月的最后一天?
关于“最后7天”:我用了整整7天的时间(不包括今天——不一定是完整的),语法上可以使用一个简单的索引 (download_time) . 相关:
获取日期范围内一周中某一天的日期
带时间间隔的cte慢速左连接
带两个参数的postgresql中的间隔(天)
理想情况下,你有一个综合指数 (download_time, userid) (并满足一些前提条件)以获得非常快速的仅索引扫描。请参见:
复合索引也适用于第一个字段的查询吗? count(DISTINCT ...) 速度通常很慢。对于有许多副本的大表,有更快的技术。如果需要优化性能,请公开确切的设置和基数。
如果实际数据类型为 timestamptz ,不仅仅是 timestamp ,您还需要定义定义日边界的时区。请参见:
在rails和postgresql中完全忽略时区
关于可选短语法 GROUP BY 2 :
按组选择每组中的第一行?
关于标识符的大写:
postgresql列名是否区分大小写?

vhmi4jdf

vhmi4jdf2#

你可以用 date_trunc 函数用于从datetime中获取仅限日期的部分,并将其用于分组。
下一个查询可能是:

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

小提琴

相关问题