Вставка строк на основе условий - PullRequest
0 голосов
/ 04 марта 2020

CaseHistory table

Название таблицы: CaseHistory

В настоящее время я работаю с набором данных, цель которого - еженедельно получать информацию о случаях поддержки клиентов. В приведенном выше примере вы можете видеть ход дела 123376 с 1-й по 5-ю неделю среди других случаев. То, что я хотел бы сделать, это вставить строку для дела для каждой недели на основе 2 условий:

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

Например, нет обновления статуса для дела 123376 на 4-й неделе и предыдущего статуса для этого дело было «Ожидание» на неделе 3 (то есть дело не получено ответа и все еще продолжается). Поскольку в течение недели 4 обновление статуса для дела 123376 отсутствует, создается ложное впечатление, что дело не существует в данных недели 4. В конце мы хотели бы знать, сколько (в целом) невыполненных обращений в службу поддержки клиентов происходит в неделю (и не только в тех случаях, когда статус менялся в течение этой недели, но и во все предыдущие недели).

Как я могу добавить строки для дел на еженедельной основе в соответствии с двумя вышеуказанными условиями? В идеале, в данных за каждую неделю я хотел бы оглянуться назад на ВСЕ предыдущие случаи и на все случаи, у которых НЕ было последнего статуса как «Отвечено». Я был бы очень признателен за любые рекомендации о том, как подойти и решить эту проблему данных? Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Если я правильно понимаю, вы можете заполнить пропущенные недели различными способами. Я думаю, что рекурсивный CTE может быть самым простым:

with cte as (
      select casenumber, status, date, week,
             lead(week) over (partition by casenumber order by week) as next_week, 0 as is_new
      from t
      union all
      select casenumber,
             (case when status = 'New' then 'Waiting' else status end),
             date,
             week + 1, 1
      from cte
      where week < next_week + 1
     )
select cte.*
from cte
where is_new = 1;

Примечания:

  • Это не добавляет недель после последней записи для данного case. Непонятно, нужно ли вам это (возможно, вы захотите задать новый вопрос, если это необходимо).
  • Это меняет «новый» статус на что-то другое, поэтому 'New' не повторяется.
1 голос
/ 04 марта 2020

В конце мы хотим узнать, сколько (в целом) невыполненных обращений в службу поддержки клиентов за неделю (и не только дел, у которых был изменен статус в течение этой недели, но и за все предыдущие недели) ).

Вот один из подходов к этому:

select week, sum(cnt) outstanding_cases
from (
    select week, 1 cnt from mytable where status in ('New', 'Reopened')
    union all
    select week, -1 from mytable where status = 'Answered'
) t
group by week
order by week

Это предполагает, что рабочий процесс дела всегда начинается с 'New' (или перезапускается с 'Reopened') и заканчивается на Answered'.

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