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

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

假设这张table的最后7天:

  1. Userid Download time
  2. Rab01 2020-04-29 03:28
  3. Klm01 2020-04-29 04:01
  4. Klm01 2020-04-30 05:10
  5. Rab01 2020-04-29 12:14
  6. Osa_3 2020-04-25 09:01

以下是所需的输出:

  1. Count Download_time
  2. 1 2020-04-25
  3. 2 2020-04-29
  4. 1 2020-04-30
ltqd579y

ltqd579y1#

用postgresql测试。您还标记了redshift,它在postgres8.2上分叉,很久以前。可能有差异。。
既然您似乎对标准iso格式很满意,那么迄今为止的简单转换将是最有效的:

  1. SELECT count(DISTINCT userid) AS "Count"
  2. , download_time::date AS "Download_Day"
  3. FROM tbl
  4. WHERE download_time >= CURRENT_DATE - 7
  5. AND download_time < CURRENT_DATE
  6. 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中获取仅限日期的部分,并将其用于分组。
下一个查询可能是:

  1. SELECT
  2. count(distinct Userid) as Count, -- get unuque users count
  3. to_char(date_trunc('day', Download_time), 'YYYY-MM-DD') AS Download_Day -- convert time do day
  4. FROM table
  5. WHERE DATE_PART('day', NOW() - Download_time) < 7 -- last 7 days
  6. GROUP BY Download_Day; -- group by day

小提琴

相关问题