Как изменить статус записи в зависимости от условий для определенного номера - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть данные ниже в таблице под названием t1,

number  status  date
100718  A       01-DEC-08
100718  A       14-NOV-16
10110   I       14-NOV-16
10110   A       19-SEP-18
10110   A       27-NOV-18
102965  I       01-DEC-08
102965  I       01-DEC-09

Теперь, если какой-либо статус A (Активен) для определенного номера, тогда мне нужно установить статус A для этого номера, а дату какпоследняя активная дата и если все статусы I (неактивные) для определенного номера, то мне нужно установить статус как I для этого конкретного номера и последней неактивной даты.

Мне нужны данные, как показано ниже,

number  status  date
100718  A       14-NOV-16
100718  A       14-NOV-16
10110   A       27-NOV-18
10110   A       27-NOV-18
10110   A       27-NOV-18
102965  I       01-DEC-09
102965  I       01-DEC-09

Пожалуйста, помогите мне завершить мою работу.Спасибо:)

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Может быть, немного старомодно, но это должно работать (хотя я не пробовал):

SELECT   `number`,
         `status`,
         MAX(`date`) AS `date`
FROM     t1
WHERE    `status` = 'A'
GROUP BY `number`,
         `status`
UNION ALL
SELECT   `number`,
         `status`,
         MAX(`date`) AS `date`
FROM     t1 t1i
WHERE    `status` = 'I'
  AND    NOT EXISTS (SELECT * from t1 t1a WHERE t1i.`number` = t1a.`number` AND t1a.`status` = 'A')
GROUP BY `number`,
         `status`;

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

0 голосов
/ 30 ноября 2018

Этого можно достичь с помощью аналитических функций MIN и LAST_VALUE.

SELECT c_number,
       status,
       LAST_VALUE(c_date) OVER(
            PARTITION BY c_number,status ORDER BY c_date
            ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
       ) AS latest_dt
FROM (
     SELECT c_number,
            CASE WHEN MIN (status) OVER( PARTITION BY c_number ) = 'A' THEN 'A'
                 ELSE status END --NVL(status,'I') or default for other than A & I
       AS status,
            c_date
     FROM t1
) s
ORDER BY status,
         latest_dt;

По сути, подзапрос проверяет, существует ли хотя бы одна буква «А» в группе, и полагается на фактэтот статус 'A' является наименее статусным по алфавиту.Если у вас есть другие статусы в нижнем регистре, вы можете изменить условие CASE, добавив UPPER() к статусу.

Функция LAST_VALUE с предложением windowing получает самые последние даты для каждой комбинацииc_number и статус, полученный из подзапроса среди всех дат (UNBOUNDED PRECEDING AND UNB...).

Вы не упомянули, что происходит, если в группе есть 2 других статуса, кроме «A», скажем «I»и 'E' или NULL.В этом случае может потребоваться небольшая настройка, чтобы получить правильное значение для LAST_VALUE.

Примечание : я использовал c_number и c_date для имен столбцов в качестве даты и номераявляются зарезервированными ключевыми словами и не должны использоваться для столбцов.

Демо

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