Как пометить дело как «открытое», если тот же идентификатор дела произошел до того, как был просмотрен - PullRequest
0 голосов
/ 28 марта 2019

Я пробовал несколько различных методов, чтобы посмотреть, смогу ли я заставить это работать, но мне не повезло.

Вот то, что я пытаюсь сделать.

Каждый день есть дела, которые закрываются.Мы хотим отслеживать случаи, которые были «повторно открыты» после того, как они уже были закрыты, но в предоставленной информации нет ничего, что говорило бы о том, что это вновь открытое дело.Единственный способ сделать это - проверить, есть ли Идентификатор случая и Дата отчета, и проверить, существует ли дублирующий Идентификатор случая, который существует и был закрыт до этой даты отчета.Чтобы усложнить ситуацию, вот некоторая дополнительная информация:

1) Распространенная ситуация заключается в том, что дело закрывается, повторно открывается, а затем снова закрывается в течение одного дня (иногда несколько раз).Это должно рассматриваться как повторное открытие, каждый раз, когда это делается после первого экземпляра, даже если это тот же день (я предполагаю, что мы сгруппируем по идентификатору случая?)

2) Я запускаю отчет за 5 днейокно, поэтому дело НЕ должно засчитываться как повторное открытие, если, например, 20.03.2009 дело было закрыто впервые, а затем снова открыто в какой-то момент и закрыто снова 26.03.2009 до 3 /26/2019.В 3/20, 3/21, 3/22 и 3/25 (дни отчетов пропускают выходные и праздничные дни, это уже встроено, ничего для этого не нужно) оно НЕ должно помечаться как повторное открытие, потому чтоДело до сих пор имеет только один экземпляр на или до даты отчета, которую мы рассматриваем.3/26 он будет помечен как повторно открытый, потому что тогда он будет закрыт во второй раз до или до даты отчета.

Вот некоторые запросы:

CREATE TABLE ResolvedCases(
    Case_ID varchar(20),
    Case_Closed_On datetime,
    Report_Date date,
    Is_ReOpened_Case VarChar(3) NULL
) 

INSERT INTO ResolvedCases VALUES('US1236', '2019-02-16 12:30:45', '2/16/2019')
INSERT INTO ResolvedCases VALUES('US1238', '2019-02-28 15:30:45', '2/28/2019')
INSERT INTO ResolvedCases VALUES('US1234', '2019-03-19 12:30:45', '3/19/2019')
INSERT INTO ResolvedCases VALUES('US1234', '2019-03-19 15:30:45', '3/19/2019')
INSERT INTO ResolvedCases VALUES('US1235', '2019-03-20 9:30:45', '3/20/2019')
INSERT INTO ResolvedCases VALUES('US1235', '2019-03-23 12:40:45', '3/23/2019')
INSERT INTO ResolvedCases VALUES('US1236', '2019-03-20 12:30:45', '3/24/2019')
INSERT INTO ResolvedCases VALUES('US1237', '2019-03-25 12:30:45', '3/25/2019')

Ожидаемые результаты (показаны только случаи с Report_Date между 3/20 и 3/26):

Case_ID    Case_Closed_On       Report_Date    Is_ReOpened_Case
US1234     2019-03-19 12:30:45    3/19/2019            No  (There is a duplicate case Id on 3/19 but it didn't happen until 3:30 PM---at 12:30PM this hadn't occurred yet so it was not a re-open at that time)
US1234     2019-03-19 15:30:45    3/19/2019            Yes
US1235     2019-03-20 9:30:45      3/20/2019            No (There is a duplicate case Id on 3/23 but on 3/20 this hadn't occurred yet so it was no a re-open on that date)
US1235     2019-03-23 12:40:45    3/23/2019            Yes
US1236     2019-03-20 12:30:45    3/24/2019            Yes (Because of the case closed on 2/16/2019 even though it doesn't show in this query)
US1237    2019-03-25 12:30:45     3/25/2019            No

Любая помощь будет оценена с этим ...

У меня есть кое-что, что показываетподсчет идентификатора дела, который показывает мне все дубликаты для заданного диапазона дат и сгруппировал их по Case_ID, но я не уверен, как просто пометить каждую отдельную строку как повторно открытую или не основанную на требованиях выше ...

1 Ответ

0 голосов
/ 29 марта 2019

При возникновении непосредственной проблемы вы можете использовать LAG, чтобы обновить таблицу с нужным вам флагом. (Возвращает NULL, если предшествующего значения нет, поэтому логика в операторе CASE.)

UPDATE rc
  SET rc.Is_ReOpened_Case = sq.Is_ReOpened_Case
FROM 
  @ResolvedCases AS rc
  LEFT JOIN 
  (
    SELECT 
      Case_ID
     ,Case_Closed_On
     ,Report_Date
     ,Is_ReOpened_Case = 
        CASE 
          WHEN LAG(Case_ID) OVER (PARTITION BY Case_ID ORDER BY Case_Closed_On) IS NOT NULL 
           THEN 'Yes' 
          ELSE 'No' 
        END 
    FROM @ResolvedCases
  ) AS sq
    ON sq.Case_ID = rc.Case_ID
    AND sq.Case_Closed_On = rc.Case_Closed_On
WHERE
  COALESCE(rc.Is_ReOpened_Case,'') <> COALESCE(sq.Is_ReOpened_Case,'')


SELECT 
   rc.*
FROM @ResolvedCases AS rc
WHERE rc.Report_Date >= '20190319' AND rc.Report_Date < '20190326'
ORDER BY Case_ID, Case_Closed_On;

Результаты:

+---------+-------------------------+-------------+------------------+
| Case_ID |     Case_Closed_On      | Report_Date | Is_ReOpened_Case |
+---------+-------------------------+-------------+------------------+
| US1234  | 2019-03-19 12:30:45.000 | 2019-03-19  | No               |
| US1234  | 2019-03-19 15:30:45.000 | 2019-03-19  | Yes              |
| US1235  | 2019-03-20 09:30:45.000 | 2019-03-20  | No               |
| US1235  | 2019-03-23 12:40:45.000 | 2019-03-23  | Yes              |
| US1236  | 2019-03-20 12:30:45.000 | 2019-03-24  | Yes              |
| US1237  | 2019-03-25 12:30:45.000 | 2019-03-25  | No               |
+---------+-------------------------+-------------+------------------+

Но после этого вам нужно будет что-то сделать с кодом, который заполняет эту таблицу, чтобы сохранить эти значения для будущих записей. Это может потребовать двухэтапного решения, но вам придется принять решение после просмотра этого кодового набора. Может быть, просто запустите UPDATE после загрузки данных.

...