假设我有一张桌子告诉我什么时候某个东西被激活和停用:
CREATE TABLE [dbo].[active]
(
[timestamp] [DATETIME] NOT NULL,
[activated] [BIT] NOT NULL
)
我最好尝试对此进行查询以检索事物处于活动状态的时间间隔:
SELECT a.timestamp AS 'ActivatedDate',
Deactivated.timestamp
FROM active a
OUTER apply (SELECT Min(d.timestamp) AS TimeStamp
FROM active d
WHERE activated = 0
AND d.timestamp > a.timestamp) AS Deactivated
WHERE a.activated = 1
我需要重写它,以便它可以与ANSI SQL一起使用,或者至少同时使用T-SQL和Oracle 9.我的理解是OUTER适用于Oracle 9不适用。
如果有更好的方法来做这种事情,请分享! :)
我需要这个以检查在启用/禁用此事件时是否发生了某些事件。谢谢!
答案 0 :(得分:1)
使用相关子查询:
select a.timestamp as ActivatedDate,
(select min(d.timestamp)
from active d
where d.activated = 0 and
d.timestamp > a.timestamp
) as DeactivedDate
from active a
where a.activated = 1;
这是ANSI SQL,它应该在SQL Server和Oracle(以及几乎所有其他数据库)中工作。
请注意:可能有更有效的方法在任何给定的数据库中执行您想要的操作。