Взятие максимальной даты из трех столбцов даты - PullRequest
0 голосов
/ 08 октября 2019

Мне нужно взять максимальную дату из трех столбцов по идентификатору: дата создания, дата обновления и дата транзакции. Ниже приведена упрощенная версия того, как выглядят данные, на которые я ссылаюсь, и не отражает фактические данные, с которыми я работаю.

+--------------------------------------------------------+
| ID |  Date Created   | Updated Date | Transaction Date |
+--------------------------------------------------------+
| 12 |   19-APR-19     |     NULL     |     20-APR-19    |
| 68 |   02-Nov-18     |   03-DEC-18  |     02-NOV-18    |
| 12 |   05-MAY-19     |   12-MAY-19  |     12-MAY-19    |
| 72 |   10-SEP-19     |   01-OCT-19  |     25-SEP-19    |
+--------------------------------------------------------+

Получив максимум этих столбцов для каждого идентификатора, я должен получить:

+---------------------+
| ID |      Date      | 
+---------------------+
| 68 |   03-DEC-18    |   
| 12 |   12-MAY-19    |     
| 72 |   01-OCT-19    |   
+---------------------+

До сих пор я пробовал следующие варианты:

   CASE WHEN
      TO_CHAR(ud.updated_date,'MM/DD/YYYY') >= TO_CHAR(NVL(mqp.trans_effective_date,0),'MM/DD/YYYY') AND TO_CHAR(ud.updated_date,'MM/DD/YYYY') >= TO_CHAR(NVL(mt.date_created,0),'MM/DD/YYYY') THEN TO_CHAR(ud.updated_date,'MM/DD/YYYY')
      WHEN 
      TO_CHAR(mt.transaction_date,'MM/DD/YYYY') >= TO_CHAR(NVL(ud.updated_date,0),'MM/DD/YYYY') AND TO_CHAR(mt.transaction_date,'MM/DD/YYYY') >= TO_CHAR(NVL(mt.date_created,0),'MM/DD/YYYY') THEN TO_CHAR(mt.transaction_date,'MM/DD/YYYY')
      WHEN
      TO_CHAR(mt.date_created,'MM/DD/YYYY') >= TO_CHAR(NVL(ud.updated_date,0),'MM/DD/YYYY') AND TO_CHAR(mt.date_created,'MM/DD/YYYY') >= TO_CHAR(NVL(mt.transaction_date,0),'MM/DD/YYYY') THEN TO_CHAR(mt.date_created,'MM/DD/YYYY')
  END Date

Но это заканчивается следующей ошибкой:

ORA-00932: inconsistent datatypes: expected NLS PARAMETER got DATE
00932. 00000 -  "inconsistent datatypes: expected %s got %s"
*Cause:    
*Action:

Я также пробовал различные варианты:

  GREATEST(TO_CHAR(mt.date_created,ud.updated_date,mt.transaction_date), 'MM/DD/YYYY') Date

Но тогда я получаю эту ошибку:

ORA-00932: inconsistent datatypes: expected NLS PARAMETER got DATE
00932. 00000 -  "inconsistent datatypes: expected %s got %s"
*Cause:    
*Action

Любой совет будет принята с благодарностью!

Ответы [ 3 ]

2 голосов
/ 08 октября 2019

Использование greatest():

select id, greatest(updated_date, mqp.trans_effective_date, mt.date_created)
from . . .

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

Если у вас есть идентификаторыв нескольких строках используйте агрегирование:

select id, greatest(max(updated_date), max(mqp.trans_effective_date), max(mt.date_created))
from . . .
0 голосов
/ 08 октября 2019

Вы попробовали правильно, просто нужно просто изменить (сначала возьмите самую большую дату, а затем конвертируйте ее в символ, используя TO_CHAR):

TO_CHAR(GREATEST(mt.date_created,ud.updated_date,mt.transaction_date), 'MM/DD/YYYY') as your_Date

Cheers !!

0 голосов
/ 08 октября 2019

Вы хотите получить максимум из трех дат, если группируете по идентификатору:

SELECT ID, 
  TO_CHAR(MAX(GREATEST("date_created", "updated_date", "transaction_date")),'MM/DD/YYYY') "Date"
FROM tablename
GROUP BY ID

См. Демоверсию . Результаты:

> ID | Date      
> -: | :---------
> 72 | 10/01/2019
> 68 | 12/03/2018
> 12 | 05/12/2019
...