【发布时间】:2017-09-17 06:44:17
【问题描述】:
我在红移数据库中有一组记录,每个记录都有一个指示活动开始的时间戳和一个指示活动结束的时间戳。
timestamp_start |timestamp_end
2017-01-01 01:01:31 |2017-01-01 01:48:31
2017-01-01 01:02:35 |2017-01-01 02:08:35
2017-01-01 01:09:10 |2017-01-01 02:18:10
2017-01-01 01:10:05 |2017-01-01 02:00:05
2017-01-01 01:14:58 |2017-01-01 01:56:58
2017-01-01 01:19:10 |2017-01-01 02:18:10
2017-01-01 01:25:10 |2017-01-01 01:54:10
2017-01-01 01:30:23 |2017-01-01 01:56:23
2017-01-01 01:36:26 |2017-01-01 03:06:26
2017-01-01 01:37:03 |2017-01-01 02:14:03
2017-01-01 01:37:15 |2017-01-01 02:08:15
2017-01-01 01:37:55 |2017-01-01 02:58:55
2017-01-01 01:42:49 |2017-01-01 02:59:49
2017-01-01 01:44:10 |2017-01-01 03:23:10
2017-01-01 01:46:49 |2017-01-01 02:58:49
2017-01-01 01:49:34 |2017-01-01 02:15:34
2017-01-01 01:52:11 |2017-01-01 02:38:11
2017-01-01 01:52:45 |2017-01-01 03:31:45
2017-01-01 01:54:15 |2017-01-01 02:17:15
2017-01-01 01:55:14 |2017-01-01 02:40:14
这是一种计算每分钟新活动发生次数的简单方法,方法如下:
select date_trunc('minute', timestamp_start) as minute, count(*) as count
from myTable
group by 1
类似地计算一个活动的结束:
select date_trunc('minute', timestamp_end) as minute, count(*) as count
from myTable
group by 1
但是,我如何计算每分钟“正在进行”的活动[编辑:在某个范围内的每一分钟]?即在分钟组 01:01 我们有一个新的活动开始。在 01:02 分钟,我们又开始了一个新的活动,但是从 01:01 开始的活动还没有结束,因此当前活动的计数是两个。相反,02:00 的记录计数必须不包括在该分钟之前完成的 4 条记录中的任何一条。
此外,解决方案也不能“爆炸”数据,即将记录连接到“准备”分钟的不同表以提供记录的多个重复项,然后计算结果表的长度。
我尝试了以下方法:
SELECT
minute,
count(CASE WHEN timestamp_end > minute AND timestamp_start < minute) AS tmp
FROM (
SELECT minute
FROM (
(
SELECT date_trunc('minute', timestamp_start) AS minute
FROM myTable
GROUP BY 1
)
UNION ALL (
SELECT date_trunc('minute', timestamp_end) AS minute
FROM myTable
GROUP BY 1
)
) s1
GROUP BY 1)
但是,我怀疑我的案例论证形成错误,很可能会误用它。我也查看了窗口函数,但是,我看不到一种明显的方法来向前计数以仅包含“当前活动”记录。
【问题讨论】:
-
很遗憾,您当前的查询既有逻辑问题,也有句法问题;所以你可能不得不回到绘图板上。第一个问题:您想如何确定输出中包含哪些分钟?在某个范围内的每一分钟?每分钟都有一个非零计数?其他...?
-
能否根据您提供的示例输出将预期结果添加到您的问题中?你的描述很透彻,但恐怕还是有误会的余地
-
@MarkAdelsberger 在某个范围内的每一分钟,都会更新
-
@DaveRGP 好的,但请注意,您在某些时候肯定需要做一些“爆炸”。即使您将结果限制在特定范围内,您也希望结果集包含原始表中不存在的数据点。为了实现这一点,您要么需要“分解”数据,要么进行一些程序式计算(如 TSQL 中的循环)。纯 SQL 无法做到这一点。
-
@DaveRGP - 公平地说,没有像样的数据库会通过复制事件记录的
N来实现 InfiniteRefactor 描述的查询。正如我在回答中所说,如果对此的担忧是推测性的(而不是基于观察到的这种方法的问题),那么我真的认为应该在被拒绝之前对其进行测试。
标签: sql count amazon-redshift