Search code examples
sqlwindow-functions

Number of days since last activity - SQL


I'm trying to count the number of days since the last activity. My data is weekly aggregated. I'm able to do the lag but not able to include the current week.

Data:

ID       DATE       CHANNEL  VENDOR   ENG
xyz      2022-11-18 EMAIL    ALPHA    1 
xyz      2022-11-25 EMAIL    ALPHA    1 
xyz      2022-12-09 EMAIL    ALPHA    1 
xyz      2022-12-16 EMAIL    ALPHA    0 
xyz      2022-12-23 EMAIL    ALPHA    0
xyz      2022-12-30 EMAIL    ALPHA    3

I would like to have the output to be as follows:

ID       DATE       CHANNEL  VENDOR   ENG   n_days
xyz      2022-11-18 EMAIL    ALPHA    1     0
xyz      2022-11-25 EMAIL    ALPHA    1     0
xyz      2022-12-09 EMAIL    ALPHA    1     0
xyz      2022-12-16 EMAIL    ALPHA    0     7
xyz      2022-12-23 EMAIL    ALPHA    0     14
xyz      2022-12-30 EMAIL    ALPHA    3     0

I have written a query but it not able to include the most latest week. Below is my query:

SELECT DISTINCT ID, DATE, CHANNEL, VENDOR,
     DATE - LAG(DATE) OVER (PARTITION BY ID, CHANNEL, VENDOR ORDER BY DATE) AS "NDAYS_LAST_ENGAGED_CHANNEL_VENDOR"
FROM 
   tab1
WHERE 
   ENG>0

Solution

  • I was able to construct a right query that would give difference in days since last event in a chronological order with a massive help of James Casey. The query is as below:

    QUERY:

    SELECT T1.ID, T1.DATE, T1.CHANNEL, T1.VENDOR,
           IFNULL(MIN(DATEDIFF(DD, T_ENG.EVENT_DATE, T1.EVENT_DATE)), -1) AS "N_DAYS"
    FROM
      TAB1 AS T1
    LEFT OUTER JOIN 
        TAB1 AS T_ENG 
            ON T_ENG.ENG>0 AND T1.ID=T_ENG.ID AND T1.CHANNEL=T_ENG.CHANNEL AND T1.VENDOR=T_ENG.VENDOR
                AND DATEDIFF(DD, T_ENG.DATE, T1.DATE)>=0
    GROUP BY
        T1.ID, T1.DATE, T1.CHANNEL, T1.VENDOR
    ORDER BY 2;