Search code examples
sqlplsql

Comparing dates from 2 columns minus one position on one of the columns


I am trying to achieve the following in: DATE_2 column 1.The first result I always take it from DATE_1 column " 25-JUN-18", then I have to do a comparison. if DATE_1, rn 2, 25-JUN-18 > DATE_2, rn 1, 25-JUN-18 then DATE_1, rn 2, 25-JUN-18 else DATE_2, rn 1, 25-JUN-18 end DATE_2

Current result 
    rn   DATE_1        DATE_2
    1    25-JUN-1      25-JUN-18
    2    25-JUN-18     NULL
    3    25-JUN-18     NULL
    4    09-JAN-19     NULL
    5    02-SEP-20     NULL
    6    01-DEC-23     NULL
    7    01-DEC-23     NULL

 Expected result

   rn   DATE_1      DATE_2
    1  25-JUN-18    25-JUN-18
    2  25-JUN-18    25-JUN-18
    3  25-JUN-18    25-JUN-18
    4  09-JAN-19    09-JAN-19
    5  02-SEP-20    02-SEP-20 
    6  01-DEC-23    01-DEC-23
    7  01-DEC-23    01-DEC-23
      

this is the result of the main table

      CREATE TABLE tbl22
    (MAXDATE, RN) AS 
     SELECT '25-JUN-18',  1 FROM DUAL UNION ALL
     SELECT '25-JUN-18',  2 FROM DUAL UNION ALL
     SELECT '25-JUN-18',  3 FROM DUAL UNION ALL
     SELECT '09-JAN-19',  4 FROM DUAL UNION ALL
     SELECT '02-SEP-20',  5 FROM DUAL UNION ALL
     SELECT '01-DEC-23',  6 FROM DUAL UNION ALL
     SELECT '01-DEC-23',  7 FROM DUAL UNION ALL
     SELECT '02-SEP-20',  8 FROM DUAL UNION ALL
     SELECT '01-DEC-23',  9 FROM DUAL UNION ALL
     SELECT '02-SEP-20',  10 FROM DUAL UNION ALL
     SELECT '01-DEC-23',  11 FROM DUAL 

What i should get; should always remain the largest date

      25-Jun-18
      25-Jun-18
      25-Jun-18
      9-Jan-19
      2-Sep-20
      1-Dec-23
      1-Dec-23
      1-Dec-23
      1-Dec-23
      1-Dec-23
      1-Dec-23

I tried many times to use LEAD and LAG. But I was not able to achieve the required result


Solution

  • Make sure the maxdate column data type really is date. Then use MAX() window function:

    select rn, maxdate, max(maxdate) over (order by rn)
    from tbl22
    

    Demo:

    CREATE TABLE tbl22 (rn int, maxdate date);
    
    insert into tbl22 (maxdate, rn)
     SELECT date'2018-06-25',  1 FROM DUAL UNION ALL
     SELECT date'2018-06-25',  2 FROM DUAL UNION ALL
     SELECT date'2018-06-25',  3 FROM DUAL UNION ALL
     SELECT date'2019-01-09',  4 FROM DUAL UNION ALL
     SELECT date'2020-09-02',  5 FROM DUAL UNION ALL
     SELECT date'2023-12-01',  6 FROM DUAL UNION ALL
     SELECT date'2023-12-01',  7 FROM DUAL UNION ALL
     SELECT date'2020-09-02',  8 FROM DUAL UNION ALL
     SELECT date'2023-12-01',  9 FROM DUAL UNION ALL
     SELECT date'2020-09-02',  10 FROM DUAL UNION ALL
     SELECT date'2023-12-01',  11 FROM DUAL;
    
    select rn, maxdate, max(maxdate) over (order by rn) from tbl22 
    
    RN  MAXDATE     MAX(MAXDATE)OVER(ORDERBYRN)
     1  25-JUN-18   25-JUN-18
     2  25-JUN-18   25-JUN-18
     3  25-JUN-18   25-JUN-18
     4  09-JAN-19   09-JAN-19
     5  02-SEP-20   02-SEP-20
     6  01-DEC-23   01-DEC-23
     7  01-DEC-23   01-DEC-23
     8  02-SEP-20   01-DEC-23
     9  01-DEC-23   01-DEC-23
    10  02-SEP-20   01-DEC-23
    11  01-DEC-23   01-DEC-23
    

    https://dbfiddle.uk/dUKxoLNu