0

テーブルから正しいデータを選択するためのクエリに問題があります。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 に関連する開始日と終了日に注意してください)。メンバー ID 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
4

2 に答える 2

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
            )
          )
于 2013-10-08T22:49:28.753 に答える
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
于 2013-10-08T22:40:00.103 に答える