удаление последовательных строк - PullRequest
1 голос
/ 26 июля 2011
ClaimID ClaimStatusCode StatusDate
11,     Closed,         2010-05-10 12:19:00.000
11,     Open,           2010-05-25 09:30:00.000
11,     Closed,         2011-06-01 00:00:00.000
11,     Open,           2011-06-10 00:00:00.000
22,     Closed,         2011-03-14 00:00:00.000
22,     Open,           2011-05-04 00:00:00.000
33,     Closed,         2007-12-19 17:19:00.000
33,     Open,           2007-12-24 12:07:00.000
**33,   Open,           2008-09-08 15:36:00.000**
44,     Closed,         2008-11-19 17:19:00.000
44,     Open,           2008-12-24 12:07:00.000
44,     Closed,         2009-07-28 15:36:00.000

Для любого ClaimID, если статус заявки Open открыт после open, тогда вторая строка статуса Open не требуется. То есть каждый раз, когда Closed следует за Open. Здесь Последняя строка для ClaimID 33 с StatusDate 2008-09-08 15: 36: 00.000 не требуется (помечено для справки). Я попытался использовать функцию rownumber, но безуспешно.

Ответ должен быть:

ClaimID ClaimStatusCode StatusDate 
11,     Closed,         2010-05-10 12:19:00.000
11,     Open,           2010-05-25 09:30:00.000
11,     Closed,         2011-06-01 00:00:00.000
11,     Open,           2011-06-10 00:00:00.000
22,     Closed,         2011-03-14 00:00:00.000
22,     Open,           2011-05-04 00:00:00.000
33,     Closed,         2007-12-19 17:19:00.000
33,     Open,           2007-12-24 12:07:00.000
44,     Closed,         2008-11-19 17:19:00.000
44,     Open,           2008-12-24 12:07:00.000
44,     Closed,         2009-07-28 15:36:00.000

Ответы [ 2 ]

1 голос
/ 26 июля 2011

Я использовал Cross Apply, чтобы получить предыдущий статус для строки, а затем проверил, когда предыдущий статус совпадает с текущим статусом:

delete ct
from
    claimtest ct
    cross apply (
        select top 1 prevstatus = ClaimStatusCode 
        from claimtest sub 
        where ct.claimid = sub.claimid and sub.statusdate < ct.statusdate 
        order by statusdate desc
    ) p
where 
    ct.ClaimStatusCode = p.prevstatus
0 голосов
/ 26 июля 2011
    SELECT
       ClaimID, ClaimStatusCode, MIN(StatusDate)
    FROM
       Table
   GROUP BY
      ClaimID, ClaimStatusCode
   HAVING
      SUM(CASE claimID WHEN 'Open' THEN 1 ELSE -1 END) <= 1

РЕДАКТИРОВАТЬ за свой комментарий - добавлено предложение HAVING

PS - этот выбор получает ваши "хорошие" записи для вас.Если вы хотите изменить его, чтобы получить только «плохие» записи (я полагаю, кандидаты на удаление), то используйте MAX вместо MIN и используйте> 1 в предложении has.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...