【发布时间】:2012-12-26 07:04:14
【问题描述】:
我在 MS SQL Server 中有一个类似于下面的表。
id | Timestamp | active
-----+-----------+--------
1 | 1:00 | 1
1 | 2:00 | 1
1 | 3:00 | 1
1 | 4:00 | 0
1 | 5:00 | 0
1 | 6:00 | 1
1 | 7:00 | 0
1 | 8:00 | 0
1 | 9:00 | 0
1 | 10:00 | 1
1 | 11:00 | 1
1 | 12:00 | 0
1 | 13:00 | 1
2 | 2:00 | 1
2 | 3:00 | 1
2 | 4:00 | 0
2 | 5:00 | 0
3 | 8:00 | 0
3 | 9:00 | 0
4 | 1:00 | 1
4 | 2:00 | 1
5 | 16:00 | 0
我想知道每个 ID 何时处于非活动状态(活动 = 0)多长时间。我试图做的是在 active = 0 时按 id 对它进行分组,并在最小和最大时间上做一个 datediff。但这会给我一个 id 1 的结果,表示它在 12:00 时离线 8 小时(12:00 - 4:00)。当我真正想要的是一个查询,它会给我以下结果集。
id | approx. offline in hours | at time
---+--------------------------+-----------
1 | 1 | 5:00
1 | 2 | 9:00
1 | 0 | 12:00
2 | 1 | 5:00
3 | 0 | 9:00
5 | 0 | 16:00
我最初尝试的错误查询是
SELECT id as [Inactive],
DATEDIFF(hour, MIN(Timestamp), MAX(Timestamp)) as [approx. offline in hours],
MAX(Timestamp) as [at time]
FROM table
WHERE active = 0
GROUP BY [Inactive]
但该查询的问题在于它跳过了中间的活动时间。我一直在查看使用 PARTITION 提出和回答的THIS 问题,但看起来问题已经足够不同,而且答案对于我无法理解的问题来说太具体了。
感谢任何帮助。
【问题讨论】:
-
你在使用什么 rdbms? sql-server,oracle?
-
@bluefeet 方括号最有可能 == SQL Server
-
@JoachimIsaksson 我同意,但他们应该说明他们正在使用什么 rdbms。
-
你说得对,我忘了说我使用的是 SQL Server。我将编辑我的问题并将其包括在内。