Search code examples
oracle-databasestored-proceduresview

Display NO of Days with latest modified date in Oracle


I have a view where I am displaying NO_OF_DAYS_AGING based on MODIFIED_DATE but for some rows, there are 2 MODIFIED_DATE. So I want to calculate based on the latest MODIFIED_DATE.

Here is NO_OF_DAYS_AGING logic.

ROUND ((SYSDATE - JPD.MODIFIED_DATE), 0) as "JPD.MODIFIED_DATE",

Also please see the whole VIEW for reference.

CREATE OR REPLACE VIEW "APP_FIBERINV"."CMP_PANINDIA_VIEW_AGING_DAYS" ("CIRCLE", "MP", "SPAN_TYPE", "SPAN_LINK_ID", "NE_LENGTH", "ROUTE_ACCEPTED", "LIT_ACCEPTED", "MISSING_ASBUILT", "STATUS", "OFFERED_DATE", "HOTO_ACCEPTED_DATE", "LIT_ACCEPTED_DATE", "ASSIGNED_BY", "ASSIGNED_TO", "JOB_PROGRESS_FLAG", "ROUTE_APPROVED_BY_CMM", "LIT_APPROVED_BY_CMM", "CMM_APPROVED_DATE", "REOFFERFLAG", "NO_OF_DAYS_AGING", "REJECT_REMARKS") AS 
  WITH MAIN_DATA AS 
(
        SELECT DISTINCT MZB.JIOSTATENAME,MZB.JIOSTATECODE,MZB.MAINTENANCEZONENAME,MZB.MAINTENANCEZONECODE
        FROM R4G_LB.MANTAINENCEBOUNDARY_EVW MZB
          ORDER BY MZB.JIOSTATENAME
),
HOTOSTATUS AS 
(
    SELECT SM.STATUS_ID,SM.STATUS_NAME AS STATUS FROM APP_FIBERINV.TBL_FIBER_INV_STATUS_MASTER SM
),
JOBS_DATA AS 
(
      SELECT DISTINCT JB.JOB_ID,NVL(JB.SPAN_ID,'NA') AS SPAN_ID,
      NVL(JB.LINK_ID,'NA') AS LINK_ID, 
      NVL(JB.FSA_ID,'NA') AS FSA_ID,
      CASE WHEN JB.SPAN_TYPE = 'INTERCITY' THEN JB.SPAN_ID
            WHEN JB.SPAN_TYPE = 'INTRACITY' THEN JB.LINK_ID
            WHEN JB.SPAN_TYPE = 'ENTERPRISE' THEN JB.LINK_ID
            WHEN JB.SPAN_TYPE = 'FTTX' THEN JB.FSA_ID
      END AS CLUBED_SPAN,
      JB.MAINTENANCEZONECODE AS MAINTENANCE_CODE,
      JB.CREATED_DATE AS OFFERED_DATE,
      NVL(JB.MAINT_ZONE_NE_SPAN_LENGTH,0) AS NE_LENGTH,
      NVL(JB.MISSING_ABD_LENGTH,0) AS MISSING_ABD_lENGTH,
      JB.SPAN_TYPE,JB.JOB_FLAG,JB.REOFFERFLAG
      FROM APP_FIBERINV.TBL_FIBER_INV_JOBS JB where not exists(SELECT SPAN_LINK_ID FROM 
      APP_FIBERINV.TBL_FIBER_INV_DROPSPAN kb where jb.SPAN_ID=kb.SPAN_LINK_ID) or not exists (SELECT SPAN_LINK_ID
      FROM APP_FIBERINV.TBL_FIBER_INV_DROPSPAN kb where jb.SPAN_ID=kb.SPAN_LINK_ID)
),
JOBPROGRESS_DATA AS 
(
     SELECT T.JOB_ID,T.STATUS_ID,
     T.HOTO_ACTUAL_LENGTH,
     T.LIT_ACTUAL_LENGTH,
     T.HOTO_OFFERED_DATE,
     T.HOTO_ACCEPTED_DATE,T.LIT_ACCEPTED_DATE,     
     T.JOB_PROGRESS_FLAG,
     T.MODIFIED_DATE,
     T.APPROV_REJECT_REMARK
     FROM 
     (
        SELECT DISTINCT JBP.JOB_PROGRESS_ID,JBP.JOB_ID,ROW_NUMBER() OVER (PARTITION by JBP.job_id ORDER BY JBP.job_id) AS SRNO,
        JBP.STATUS_ID,        
        SUM(NVL((CASE WHEN JBP.REJECTED_BY LIKE ('%') AND JBP.UMS_GROUP_ASS_TO_NAME LIKE ('Construction_Engineer') AND JBP.JOB_PROGRESS_FLAG = 0 THEN 0 ELSE JBP.HOTO_ACTUAL_LENGTH END),0)) over (PARTITION by JBP.job_id ORDER BY JBP.JOB_ID ) AS HOTO_ACTUAL_LENGTH,
        SUM(NVL((CASE WHEN JBP.REJECTED_BY LIKE ('%') AND JBP.UMS_GROUP_ASS_TO_NAME LIKE ('Construction_Engineer') AND JBP.JOB_PROGRESS_FLAG = 0 THEN 0 ELSE JBP.LIT_ACTUAL_LENGTH END),0)) over (PARTITION by JBP.job_id ORDER BY JBP.JOB_ID ) AS LIT_ACTUAL_LENGTH,                
        HOTO_OFFERED_DATE,
        MAX(DECODE(JBP.HOTO_ACCEPTENCE_DATE,NULL,'01-JAN-01',JBP.HOTO_ACCEPTENCE_DATE)) over(PARTITION by JBP.job_id ORDER BY JBP.JOB_ID ) AS HOTO_ACCEPTED_DATE,
        MAX(DECODE(JBP.LIT_ACCEPTENCE_DATE,NULL,'01-JAN-01',JBP.LIT_ACCEPTENCE_DATE)) over(PARTITION by JBP.job_id ORDER BY JBP.JOB_ID ) AS LIT_ACCEPTED_DATE,                
        JBP.JOB_PROGRESS_FLAG, JBP.MODIFIED_DATE, JBP.APPROV_REJECT_REMARK
         FROM  APP_FIBERINV.TBL_FIBER_INV_JOB_PROGRESS JBP           
      )T WHERE T.SRNO = 1
),
ASSIGNDATA AS
(
SELECT JOB_ID,ASSIGNED_BY,ASSIGNED_TO FROM (
   SELECT DISTINCT X.JOB_ID, DECODE(Y.UMS_GROUP_ASS_BY_NAME,NULL,'NA',Y.UMS_GROUP_ASS_BY_NAME) AS ASSIGNED_BY,
   DECODE(Y.UMS_GROUP_ASS_TO_NAME,NULL,'NA',Y.UMS_GROUP_ASS_TO_NAME) AS ASSIGNED_TO
    FROM 
   (
      SELECT Y1.JOB_ID,Y1.UMS_GROUP_ASS_TO_DATE,Y1.job_progress_flag FROM (
         SELECT JP1.JOB_ID,JP1.job_progress_flag,row_number() over (partition by JP1.JOB_ID order by JP1.JOB_ID) SRNO,
        MAX(DECODE (JP1.UMS_GROUP_ASS_TO_DATE,NULL,TO_DATE('01-01-1801','DD-MM-YYYY'),JP1.UMS_GROUP_ASS_TO_DATE)) AS UMS_GROUP_ASS_TO_DATE
        FROM APP_FIBERINV.TBL_FIBER_INV_JOB_PROGRESS JP1 
        GROUP BY JP1.JOB_ID,JP1.job_progress_flag
        order by  JP1.JOB_ID
        )Y1 WHERE Y1.SRNO = 1
    )X,APP_FIBERINV.tbl_fiber_inv_job_progress Y
    WHERE X.JOB_ID = Y.job_id 
    AND (CASE WHEN X.UMS_GROUP_ASS_TO_DATE = TO_DATE('01-01-1801','DD-MM-YYYY') 
     THEN 1 ELSE CASE WHEN TO_DATE(X.UMS_GROUP_ASS_TO_DATE,'DD-MM-YYYY') = TO_DATE(Y.UMS_GROUP_ASS_TO_DATE,'DD-MM-YYYY')  THEN 1 ELSE 0 END END) = 1
     AND X.job_progress_flag = Y.job_progress_flag
    )ORDER BY JOB_ID    
),
CMMAPPROVEDKM AS 
(
  SELECT JOB_ID,MAINTENANCE_CODE,ROUTE_APPROVED_BY_CMM, LIT_APPROVED_BY_CMM,CMM_APPROVED_DATE FROM tbl_fiber_inv_cmpapproved_info
)
SELECT DISTINCT MD.JIOSTATENAME AS CIRCLE,MD.MAINTENANCEZONENAME||'/'||JD.MAINTENANCE_CODE AS MP,JD.SPAN_TYPE AS SPAN_TYPE,
JD.CLUBED_SPAN AS SPAN_LINK_ID,
JD.NE_LENGTH,
JPD.HOTO_ACTUAL_LENGTH AS ROUTE_ACCEPTED,
JPD.LIT_ACTUAL_LENGTH AS LIT_ACCEPTED,
JD.MISSING_ABD_lENGTH AS MISSING_ASBUILT,
HS.STATUS,
JD.OFFERED_DATE,
DECODE(JPD.HOTO_ACCEPTED_DATE,'01-JAN-01','NOT PRESENT',JPD.HOTO_ACCEPTED_DATE) AS HOTO_ACCEPTED_DATE,
DECODE(JPD.LIT_ACCEPTED_DATE,'01-JAN-01','NOT PRESENT',JPD.LIT_ACCEPTED_DATE) AS LIT_ACCEPTED_DATE,
AD.ASSIGNED_BY,
AD.ASSIGNED_TO,
JPD.JOB_PROGRESS_FLAG,
CMK.ROUTE_APPROVED_BY_CMM AS ROUTE_APPROVED_BY_CMM,CMK.LIT_APPROVED_BY_CMM AS LIT_APPROVED_BY_CMM,
CMK.CMM_APPROVED_DATE,
JD.REOFFERFLAG,
-- (SYSDATE - JPD.MODIFIED_DATE) as "JPD.MODIFIED_DATE"
ROUND ((SYSDATE - JPD.MODIFIED_DATE), 0) as "JPD.MODIFIED_DATE",
JPD.APPROV_REJECT_REMARK
FROM JOBS_DATA JD
LEFT JOIN JOBPROGRESS_DATA JPD ON JPD.JOB_ID = JD.JOB_ID
LEFT JOIN ASSIGNDATA AD ON AD.JOB_ID = JD.JOB_ID AND AD.JOB_ID = JPD.JOB_ID
LEFT JOIN CMMAPPROVEDKM CMK ON CMK.JOB_ID = JD.JOB_ID AND CMK.JOB_ID = AD.JOB_ID AND CMK.JOB_ID = JPD.JOB_ID AND JD.MAINTENANCE_CODE=CMK.MAINTENANCE_CODE
LEFT JOIN MAIN_DATA MD ON MD.MAINTENANCEZONECODE = JD.MAINTENANCE_CODE
LEFT JOIN HOTOSTATUS HS ON HS.STATUS_ID = JPD.STATUS_ID
WHERE JD.NE_LENGTH > 0
ORDER BY SPAN_TYPE,CIRCLE,MP;


Solution

  • Ignoring your huge, incomprehensible view (for which you have not provided any CREATE TABLE statements or any INSERT statements for sample data so we cannot comprehend or replicate the problem).

    If we create a minimal representative example with 3 columns:

    CREATE TABLE table_name (x, y, z) AS
      SELECT 1, 2, TRUNC(SYSDATE - 1) FROM DUAL UNION ALL
      SELECT 1, 4, TRUNC(SYSDATE - 7) FROM DUAL UNION ALL
      SELECT 2, 5, SYSDATE - 3        FROM DUAL UNION ALL
      SELECT 2, 6, TRUNC(SYSDATE - 3) FROM DUAL UNION ALL
      SELECT 3, 1, TRUNC(SYSDATE)     FROM DUAL;
    

    And want to solve the problem:

    Find the number of days (rounded to the nearest whole day) from today to the maximum z value for each x and return this for every row.

    Then you can use the analytic MAX function:

    SELECT x, y, z,
           SYSDATE AS time_now,
           ROUND(SYSDATE - z, 0) AS no_days_for_this_row,
           ROUND(SYSDATE - MAX(z) OVER (PARTITION BY x), 0) AS no_days_for_x
    FROM   table_name;
    

    Which outputs:

    X Y Z TIME_NOW NO_DAYS_FOR_THIS_ROW NO_DAYS_FOR_X
    1 2 2023-10-11 00:00:00 2023-10-12 09:37:22 1 1
    1 4 2023-10-05 00:00:00 2023-10-12 09:37:22 7 1
    2 5 2023-10-09 09:37:22 2023-10-12 09:37:22 3 3
    2 6 2023-10-09 00:00:00 2023-10-12 09:37:22 3 3
    3 1 2023-10-12 00:00:00 2023-10-12 09:37:22 0 0

    You should apply the same technique to your huge view.

    fiddle