sql - 获取最近几天不同用户 ID 的计数
问题描述
假设这张表的最后 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
解决方案
用 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<>在这里摆弄
CURRENT_DATE
是标准 SQL,适用于Postgres和Redshift。有关的:
关于“最后 7 天”:我花了最后 7天(今天不包括 - 不一定不完整),语法可以在(download_time)
. 有关的:
理想情况下,您有一个复合索引(download_time, userid)
(并满足一些先决条件)以获得非常快速的仅索引扫描。看:
count(DISTINCT ...)
通常很慢。对于有很多重复的大表,有更快的技术。如果您需要优化性能,请披露您的确切设置和基数。
如果实际数据类型timestamptz
不仅仅是timestamp
,您还需要定义定义日期边界的时区。看:
关于可选的短语法GROUP BY 2
:
关于标识符的大写:
推荐阅读
- javascript - 有没有办法可以复制 502 网关超时错误?
- java - 在 Eclipse 中运行 Weblogic
- python-3.x - 如何使用 Python 将邻接矩阵转换为转换矩阵?
- python - matplotlib:从熊猫创建多个子图(多类)
- podio - 如果我有图像 ID 或文件对象,如何从 Podio API 公开访问文件或图像
- apache - Apache VirtualHost 配置不会重定向我需要它的方式
- google-visualization - 如何在谷歌图表上显示值?
- regex - 匹配 URL 路径 A+ 或 B+ 但不匹配 AX+
- r - R中的RegEx识别数字出现的频率
- php - 为什么typo3 indexedsearch 不搜索?