查找标志处于活动状态时的间隔
Find intervals when flag was active
我需要从下面的 table 中找出标志 inserted
何时处于活动状态 (inserted = 1
)。当 inserted
处于活动状态时,我需要显示间隔 date_from
到 date_to
。
这里是 table:
no dcr action deleted inserted
--------------- ----------------------- ------ ----------- -----------
191005040000806 2014-04-17 10:39:59.790 U 1 0
191005040000806 2014-04-17 14:23:41.650 U 0 1
191005040000806 2015-03-25 09:46:03.270 U 1 0
191005040000806 2015-03-25 12:01:49.533 U 0 1
结果应该是这样的:
no date_from date_to
--------------- ----------------------- -----------------------
191005040000806 NULL 2014-04-17 10:39:59.790
191005040000806 2014-04-17 14:23:41.650 2015-03-25 09:46:03.270
191005040000806 2015-03-25 12:01:49.533 NULL
第一行 date_from
是 NULL
因为我们不知道 inserted
标志何时开始激活,但我们知道它在 2014-04-17 10:39:59.790
结束。
最后一行 date_to
是 NULL
因为 inserted
标志仍然有效。
每一行的两个标志不能相同;如果删除 = 0,则插入 = 1,反之亦然。我正在使用 SQL Server 2008R2。
这是一种解决方案:
DECLARE @t TABLE
(
no VARCHAR(20) ,
dcr DATETIME ,
inserted BIT
)
INSERT INTO @t
VALUES ( '191005040000806', '2014-04-17 10:39:59.790', 0 ),
( '191005040000806', '2014-04-17 14:23:41.650', 1 ),
( '191005040000806', '2015-03-25 09:46:03.270', 0 ),
( '191005040000806', '2015-03-25 12:01:49.533', 1 )
;WITH cte AS(
SELECT no ,
( SELECT TOP 1 dcr
FROM @t t2
WHERE t2.no = t1.no AND t2.dcr < t1.dcr
AND t2.inserted = 1
ORDER BY dcr desc
) AS date_from,
CASE WHEN dcr = '99991231' THEN NULL ELSE dcr end AS date_to
FROM ( SELECT * FROM @t UNION ALL SELECT no, '99991231', 0 FROM @t GROUP BY no) t1
WHERE t1.inserted = 0
)
SELECT no, date_from, MIN(date_to) AS date_to FROM cte
GROUP BY no, date_from
输出:
no date_from date_to
191005040000806 NULL 2014-04-17 10:39:59.790
191005040000806 2014-04-17 14:23:41.650 2015-03-25 09:46:03.270
191005040000806 2015-03-25 12:01:49.533 NULL
我需要从下面的 table 中找出标志 inserted
何时处于活动状态 (inserted = 1
)。当 inserted
处于活动状态时,我需要显示间隔 date_from
到 date_to
。
这里是 table:
no dcr action deleted inserted
--------------- ----------------------- ------ ----------- -----------
191005040000806 2014-04-17 10:39:59.790 U 1 0
191005040000806 2014-04-17 14:23:41.650 U 0 1
191005040000806 2015-03-25 09:46:03.270 U 1 0
191005040000806 2015-03-25 12:01:49.533 U 0 1
结果应该是这样的:
no date_from date_to
--------------- ----------------------- -----------------------
191005040000806 NULL 2014-04-17 10:39:59.790
191005040000806 2014-04-17 14:23:41.650 2015-03-25 09:46:03.270
191005040000806 2015-03-25 12:01:49.533 NULL
第一行 date_from
是 NULL
因为我们不知道 inserted
标志何时开始激活,但我们知道它在 2014-04-17 10:39:59.790
结束。
最后一行 date_to
是 NULL
因为 inserted
标志仍然有效。
每一行的两个标志不能相同;如果删除 = 0,则插入 = 1,反之亦然。我正在使用 SQL Server 2008R2。
这是一种解决方案:
DECLARE @t TABLE
(
no VARCHAR(20) ,
dcr DATETIME ,
inserted BIT
)
INSERT INTO @t
VALUES ( '191005040000806', '2014-04-17 10:39:59.790', 0 ),
( '191005040000806', '2014-04-17 14:23:41.650', 1 ),
( '191005040000806', '2015-03-25 09:46:03.270', 0 ),
( '191005040000806', '2015-03-25 12:01:49.533', 1 )
;WITH cte AS(
SELECT no ,
( SELECT TOP 1 dcr
FROM @t t2
WHERE t2.no = t1.no AND t2.dcr < t1.dcr
AND t2.inserted = 1
ORDER BY dcr desc
) AS date_from,
CASE WHEN dcr = '99991231' THEN NULL ELSE dcr end AS date_to
FROM ( SELECT * FROM @t UNION ALL SELECT no, '99991231', 0 FROM @t GROUP BY no) t1
WHERE t1.inserted = 0
)
SELECT no, date_from, MIN(date_to) AS date_to FROM cte
GROUP BY no, date_from
输出:
no date_from date_to
191005040000806 NULL 2014-04-17 10:39:59.790
191005040000806 2014-04-17 14:23:41.650 2015-03-25 09:46:03.270
191005040000806 2015-03-25 12:01:49.533 NULL