无法根据多个日期和NULL选择记录

时间:2013-10-08 22:05:26

标签: sql tsql sql-server-2008-r2

我在查询时遇到了一些问题,无法从我的表中选择正确的数据。我试图在enddate不为null的日期中找到一行数据,证明比听起来更难。

我的疑问是:

SELECT ms1.* FROM STATUS MS1
INNER JOIN
(
    SELECT MS.EndDate, MS.MemberID, MS.MemberStatusID, 
        MS.StartDate , M.IdentificationNumber 
    FROM MEMBER M
        INNER JOIN STATUS MS ON MS.MemberID = M.MemberID 
        AND MS.StartDate =(SELECT MAX(StartDate) FROM STATUS WHERE STATUS.MemberID = M.MemberID)
        AND MS.StartDate < MS.EndDate
    WHERE MS.EndDate IS NOT NULL
    GROUP BY MS.MemberID, MS.MemberStatusID, 
        MS.EndDate, MS.StartDate, M.IdentificationNumber
) MS2
ON MS1.MemberID = ms2.MemberID 
AND MS1.MemberStatusID = MS2.MemberStatusID
ORDER BY MS1.memberid

通过此查询,我已成功消除了几个场景,但我仍然无法将最后一个场景排除在外。该问题可以在以下数据中显示。在我的表的这个小子集中,MemberID = 3是正确的(注意与StatusID相关的开始日期和结束日期)。 MemberID 452311不正确,因为与StatusID相比,开始日期和结束日期的顺序错误。最终我试图创建一个查询,只会找到我作为memberid = 453291的记录类型。我找不到消除452311记录的方法

MemberID    MemberStatusID  StartDate                   EndDate
3               2           2011-07-18 15:49:30.000     2013-04-09 10:08:51.877
3               226157      2013-04-09 10:08:51.877     NULL
453291          165079      2012-10-22 11:02:20.843     2012-12-18 09:25:26.150
453291          175401      2012-12-18 09:25:21.150     2013-01-28 12:30:49.460
453291          194582      2013-01-28 12:30:44.460     2013-03-12 09:02:53.723
453291          210649      2013-03-12 09:02:49.723     2013-04-01 15:41:10.783
453291          253471      2013-04-01 15:41:08.783     2013-05-01 15:25:30.330
453291          261919      2013-04-01 11:03:51.733     2013-04-01 11:03:52.733
452311          165101      2012-10-22 11:02:20.843     NULL
452311          194643      2013-01-29 08:36:15.560     2013-01-29 11:45:47.333
452311          194813      2013-01-29 11:45:46.333     2013-05-01 15:25:30.330

2 个答案:

答案 0 :(得分:0)

SELECT ms1.* FROM STATUS MS1
INNER JOIN
(
    SELECT MS.EndDate, MS.MemberID, MS.MemberStatusID, 
        MS.StartDate , M.IdentificationNumber 
    FROM MEMBER M
        INNER JOIN STATUS MS ON MS.MemberID = M.MemberID 
        AND MS.StartDate =(SELECT MAX(StartDate) FROM STATUS WHERE STATUS.MemberID = M.MemberID)
        AND MS.StartDate < MS.EndDate
    WHERE MS.EndDate IS NOT NULL
    GROUP BY MS.MemberID, MS.MemberStatusID, 
        MS.EndDate, MS.StartDate, M.IdentificationNumber
) MS2
ON MS1.MemberID = ms2.MemberID 
AND MS1.MemberStatusID = MS2.MemberStatusID
AND MS2.EndDate IS NOT NULL
ORDER BY MS1.memberid

答案 1 :(得分:0)

是否要添加(在ORDER BY之前):

WHERE NOT (MS1.EndDate IS NULL AND EXISTS 
            (SELECT 1 
             FROM Status MS3
             WHERE MS3.MemberID = MS1.MemeberID 
             AND MS3.MemberStatusID = MS1.MemberStatusID
             AND MS3.StartDate > MS1.StartDate
            )
          )