【问题标题】:Get the count of distinct userids for last couple of days获取最近几天不同用户 ID 的计数
【发布时间】: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 对吧?是不是打错字了?
  • 是的,对不起....更正了。

标签: sql postgresql amazon-redshift distinct aggregate-functions


【解决方案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,适用于 PostgresRedshift。相关:

关于“过去 7 天”:我用了过去 7 天天(今天不包括 - 必然不完整),语法可以在 (download_time) 上使用普通索引。相关:

理想情况下,您在(download_time, userid) 上有一个复合索引(并满足一些先决条件)以获得非常快的index-only scans。见:

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

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

关于可选短语法GROUP BY 2

关于标识符的大小写:

【讨论】:

  • 发现它很有见地。谢谢
  • 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多