add batch remove batch split batch comment selection show hidden batches hide batch highlight batch
db<>fiddle
donate feedback about
By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
CREATE TABLE #TBL(

Email varchar(50),
First_Name varchar(50),
AccessDate DateTime

)

--Insert Values
INSERT INTO #TBL(Email , First_Name , AccessDate)
VALUES
('USER1@GMAIL','ABC','20190214'),
('USER1@GMAIL','ABC','20190212'),
('USER1@GMAIL','ABC','20190206'),
('USER1@GMAIL','ABC','20190201'),
('USER2@GMAIL','CDE','20190111'),
('USER2@GMAIL','CDE','20190210'),
('USER2@GMAIL','CDE','20190202'),
('USER2@GMAIL','CDE','20190127'),
('USER3@GMAIL','EFG','20190213'),
('USER3@GMAIL','EFG','20190211'),
('USER3@GMAIL','EFG','20190208'),
('USER3@GMAIL','EFG','20190207')

12 rows affected
WITH CTE_1 AS ( SELECT Email USER_MAIL,
AccessDate ACCESS_DATE,
DENSE_RANK() OVER(ORDER BY DATEPART(WW,AccessDate) DESC) WEEK_NUMBER,
DATEADD(wk, 1, DATEADD(DAY, 0-DATEPART(WEEKDAY, AccessDate), DATEDIFF(dd, 0, AccessDate))) WEEK_END_DATE
FROM #TBL
WHERE DATEDIFF(WW,AccessDate,GETDATE()) >= 0 AND
DATEDIFF(WW,AccessDate,GETDATE()) <= 52
) ,CTE_2 AS (SELECT * , ROW_NUMBER() OVER(PARTITION BY USER_MAIL,WEEK_NUMBER ORDER BY ACCESS_DATE DESC) as ACCESS_ORDER FROM CTE_1 )
SELECT * FROM CTE_2 WHERE ACCESS_ORDER <= 2 ORDER BY USER_MAIL,WEEK_NUMBER,ACCESS_ORDER
USER_MAIL ACCESS_DATE WEEK_NUMBER WEEK_END_DATE ACCESS_ORDER
USER1@GMAIL 14/02/2019 00:00:00 1 16/02/2019 00:00:00 1
USER1@GMAIL 12/02/2019 00:00:00 1 16/02/2019 00:00:00 2
USER1@GMAIL 06/02/2019 00:00:00 2 09/02/2019 00:00:00 1
USER1@GMAIL 01/02/2019 00:00:00 3 02/02/2019 00:00:00 1
USER2@GMAIL 10/02/2019 00:00:00 1 16/02/2019 00:00:00 1
USER2@GMAIL 02/02/2019 00:00:00 3 02/02/2019 00:00:00 1
USER2@GMAIL 27/01/2019 00:00:00 3 02/02/2019 00:00:00 2
USER2@GMAIL 11/01/2019 00:00:00 4 12/01/2019 00:00:00 1
USER3@GMAIL 13/02/2019 00:00:00 1 16/02/2019 00:00:00 1
USER3@GMAIL 11/02/2019 00:00:00 1 16/02/2019 00:00:00 2
USER3@GMAIL 08/02/2019 00:00:00 2 09/02/2019 00:00:00 1
USER3@GMAIL 07/02/2019 00:00:00 2 09/02/2019 00:00:00 2
WITH CTE_1 AS ( SELECT Email USER_MAIL,
AccessDate ACCESS_DATE,
DENSE_RANK() OVER(ORDER BY DATEPART(WW,AccessDate) DESC) WEEK_NUMBER,
DATEADD(wk, 1, DATEADD(DAY, 0-DATEPART(WEEKDAY, AccessDate), DATEDIFF(dd, 0, AccessDate))) WEEK_END_DATE
FROM #TBL
WHERE DATEDIFF(WW,AccessDate,GETDATE()) >= 0 AND
DATEDIFF(WW,AccessDate,GETDATE()) <= 52
) ,CTE_2 AS (SELECT * , ROW_NUMBER() OVER(PARTITION BY USER_MAIL,WEEK_NUMBER ORDER BY ACCESS_DATE DESC) as ACCESS_ORDER FROM CTE_1 )
SELECT DISTINCT
USER_MAIL,
MIN(ACCESS_DATE) OVER(PARTITION BY USER_MAIL, WEEK_NUMBER)
FIRST_ACCESS_DATE, MAX(ACCESS_DATE) OVER(PARTITION BY USER_MAIL, WEEK_NUMBER) SECOND_ACCESS_DATE, WEEK_NUMBER, WEEK_END_DATE
FROM CTE_2
WHERE ACCESS_ORDER <= 2
ORDER BY USER_MAIL,WEEK_NUMBER
USER_MAIL FIRST_ACCESS_DATE SECOND_ACCESS_DATE WEEK_NUMBER WEEK_END_DATE
USER1@GMAIL 12/02/2019 00:00:00 14/02/2019 00:00:00 1 16/02/2019 00:00:00
USER1@GMAIL 06/02/2019 00:00:00 06/02/2019 00:00:00 2 09/02/2019 00:00:00
USER1@GMAIL 01/02/2019 00:00:00 01/02/2019 00:00:00 3 02/02/2019 00:00:00
USER2@GMAIL 10/02/2019 00:00:00 10/02/2019 00:00:00 1 16/02/2019 00:00:00
USER2@GMAIL 27/01/2019 00:00:00 02/02/2019 00:00:00 3 02/02/2019 00:00:00
USER2@GMAIL 11/01/2019 00:00:00 11/01/2019 00:00:00 4 12/01/2019 00:00:00
USER3@GMAIL 11/02/2019 00:00:00 13/02/2019 00:00:00 1 16/02/2019 00:00:00
USER3@GMAIL 07/02/2019 00:00:00 08/02/2019 00:00:00 2 09/02/2019 00:00:00