У меня есть миллионы идентификаторов, и мне нужно найти максимальную дату из 3 разных дат для каждого идентификатора.
Затем мне нужна дата начала месяца максимальной даты.
Вот ссылка:
+---------+-----------+---------------+--------------------+
| ID | SETUP_DT | REINSTATE_DT | LOCAL_REINSTATE_DT |
+---------+-----------+---------------+--------------------+
| C111111 | 2018/1/1 | Null | Null |
| C111112 | 2015/12/9 | 2018/10/25 | 2018/10/25 |
| C111113 | 2018/10/1 | Null | Null |
| C111114 | 2018/10/6 | 2018/12/14 | 2018/12/14 |
+---------+-----------+---------------+--------------------+
И то, что я хочу, ниже:
+---------+-----------+
| ID | APP_MON |
+---------+-----------+
| C111111 | 2018/1/1 |
| C111112 | 2018/10/1 |
| C111113 | 2018/10/1 |
| C111114 | 2018/12/1 |
+---------+-----------+
Я пытаюсь использовать другой код для получения результата.
Когда я использовал case
и unpivot
длянайти некоторые конкретные идентификаторы, результат выглядит отлично.
/* case */
SELECT DIST_ID as ID,
trunc(
case
when REINSTATE_DT is not null and LOCAL_REINSTATE_DT is not null then greatest(LOCAL_REINSTATE_DT, REINSTATE_DT)
when REINSTATE_DT is null and LOCAL_REINSTATE_DT is not null then LOCAL_REINSTATE_DT
when REINSTATE_DT is not null and LOCAL_REINSTATE_DT is null then REINSTATE_DT
else SETUP_DT
end, 'MM') AS CN_APP_MON
FROM DISTRIBUTOR
where DIST_ID in ('CN111111','CN111112','CN111113','CN111114');
/* unpivot */
SELECT DIST_ID as ID,
trunc(MAX(Date_value),'MM') AS CN_APP_MON
FROM DISTRIBUTOR
UNPIVOT (Date_value FOR Date_type IN (SETUP_DT, REINSTATE_DT, LOCAL_REINSTATE_DT))
where DIST_ID in ('CN111111','CN111112','CN111113','CN111114')
GROUP BY DIST_ID;
Однако, когда я изменяю условие и пытаюсь использовать период даты для извлечения данных, результат получается странным.Чтобы быть более конкретным, я попытался заменить
where DIST_ID in ('CN111111','CN111112','CN111113','CN111114')` <br>
на
where REINSTATE_DT
between TO_DATE('2018/01/01','yyyy/mm/dd') and TO_DATE('2018/01/02','yyyy/mm/dd')`
Но функция отмены не работала.Он показал:
ORA-00904: «REINSTATE_DT»: неверный идентификатор 00904. 00000 - «% s: неверный идентификатор»
Я хочу знать:
- Какой метод более эффективен или какой еще более эффективный способ сделать это?
- Почему метод unpivot не сработал?Какая разница между этими двумя методами?
Большое вам спасибо!