【发布时间】:2017-09-28 16:21:16
【问题描述】:
我有以下几点:
DECLARE @p_StartDate DATETIME
DECLARE @p_EndDate DATETIME
DECLARE @SC TABLE
(
TimeStamp DATETIME,
Action NVARCHAR,
StudyID INT NOT NULL,
ChamberID INT NOT NULL
)
INSERT INTO @SC (TimeStamp, Action, StudyID, ChamberID)
SELECT '2017-03-28 14:05:08.040', 'I', 155, 3335
UNION ALL
SELECT '2017-03-28 14:05:08.047', 'I', 155, 3336
UNION ALL
SELECT '2017-03-28 14:36:00.157', 'I', 155, 6418
UNION ALL
SELECT '2017-03-30 13:15:04.607', 'I', 155, 3337
UNION ALL
SELECT '2017-03-30 13:15:04.607', 'I', 155, 3338
UNION ALL
SELECT '2017-04-04 13:40:28.580', 'D', 155, 3338
UNION ALL
SELECT '2017-04-04 14:48:43.593', 'D', 155, 3337
UNION ALL
SELECT '2017-04-17 20:56:07.540', 'D', 155, 3335
UNION ALL
SELECT '2017-04-17 21:05:09.507', 'I', 155, 3335
Action = 'I' 表示已分配,'D' 表示已解除分配。
在给定查询周期的情况下,我需要找到分配给研究的所有分庭。例如,如果 @p_StartDate = '20170101' AND @p_EndDate = '20170102' 那么它应该不会产生任何结果。
如果 @p_StartDate = '20170328' 和 @p_EndDate = '20170331' 则应返回以下内容:
ChamberId DateAllocated
3335 2017-03-28 14:05:08.040
3336 2017-03-28 14:05:08.047
6418 2017-03-28 14:36:00.157
3337 2017-03-30 13:15:04.607
3338 2017-03-30 13:15:04.607
如果 @p_StartDate = '20170328' 和 @p_EndDate = '20170431' 则应返回以下内容:
ChamberId DateAllocated
3335 2017-03-28 14:05:08.040
3336 2017-03-28 14:05:08.047
6418 2017-03-28 14:36:00.157
3337 2017-03-30 13:15:04.607
3338 2017-03-30 13:15:04.607
3335 2017-04-17 21:05:09.507
但是,如果 @p_StartDate = '20170418' 和 @p_EndDate = '20170431' 那么:
ChamberId DateAllocated
3336 2017-03-28 14:05:08.047
6418 2017-03-28 14:36:00.157
3335 2017-04-17 21:05:09.507
由于 3335 室的第一次分配于 2017-04-17 20:56:07.540 被释放,3338 和 3337 室在 2017-04-04 13:40:28.580 和 2017-04-04 14 被释放分别为:48:43.593。
如果可能的话,我想避免使用游标,所以我尝试了:
SELECT A.TimeStamp, A.Action, A.StudyID, A.ChamberID
FROM @SC A
LEFT JOIN
(
SELECT *
FROM @SC
WHERE Action = 'D'
) AS B
ON A.ChamberID = B.ChamberID
AND A.StudyID = B.StudyID
AND A.TimeStamp < B.TimeStamp
WHERE (A.Action = 'I' AND A.TimeStamp < @p_EndDate)
AND NOT (A.Action = 'D' AND A.TimeStamp < @p_StartDate)
AND A.StudyID = 155
AND B.TimeStamp IS NULL
ORDER BY ChamberID
任何帮助将不胜感激。谢谢。
【问题讨论】:
-
对于同一个研究,一个腔室可能会被分配,然后被释放,然后被分配,然后被重复释放。
-
您好史蒂夫,感谢您的帮助。它非常接近所需的内容,但存在一个问题。我设置了 p_StartDate = '4/03/2017 1:15:05 PM' p_EndDate = '4/18/2017 2:15:05 PM',然后我也应该把 Chamber 3337 拿回来,因为 3337 在p_StartDate。
标签: sql sql-server-2008 tsql left-join common-table-expression