Let's say I have a table labeled employees and it looks like so
date | employee id |
---|---|
4/1/2022 | 9 |
4/1/2022 | 8 |
3/1/2022 | 9 |
3/1/2022 | 8 |
3/1/2022 | 7 |
2/1/2022 | 9 |
2/1/2022 | 8 |
2/1/2022 | 7 |
1/1/2022 | 9 |
1/1/2022 | 8 |
1/1/2022 | 7 |
1/1/2022 | 6 |
1/1/2022 | 5 |
I'd like for my final output to look like below
date | departures |
---|---|
4/1/2022 | NULL |
3/1/2022 | 1 |
2/1/2022 | 0 |
1/1/2022 | 2 |
Essentially, if the employee is not found on the next upcoming month, it's counting it as a departure for the current month. I already am calculating this with the following query:
WITH MONTHLY_COUNT(DTE, EMP_COUNT) AS(
SELECT
[DATE],
COUNT(1) AS [COUNT]
FROM
employees A
GROUP BY
[DATE]),raw_data(EMPLOYEE, DATE) AS(
SELECT
A.EMPLOYEE,
[DATE]
FROM
employees A),RANKING(DTE, EMP_COUNT, RANKING) AS(
SELECT
A.DTE,
A.EMP_COUNT,
A.RANKING
FROM(
SELECT
TOP(6) ---pick the most recent x months
A.DTE,
A.EMP_COUNT,
RANK() OVER(ORDER BY A.DTE DESC) AS [RANK]
FROM
MONTHLY_COUNT AS A
)A(DTE, EMP_COUNT, RANKING))SELECT
A.DTE,
CASE
WHEN A.DTE = B.DTE THEN B.SEPARATIONS
WHEN A.DTE = C.DTE THEN C.SEPARATIONS
WHEN A.DTE = D.DTE THEN D.SEPARATIONS
END AS SEPARATIONS
FROM(
SELECT
TOP(6) --pick the most recent x months
A.DTE
FROM
MONTHLY_COUNT A
ORDER BY
A.DTE DESC
)A
--COMPARE MONTH RANK 2 AND 1
LEFT JOIN(
SELECT
A.DTE,
SUM(CASE WHEN B.EMPLOYEE IS NULL THEN 1 ELSE 0 END) AS SEPARATIONS
FROM(
SELECT *
FROM
RANKING A
LEFT JOIN
raw_data B ON A.DTE = B.DATE
WHERE A.RANKING = '2' ----this is what I want to automate
)A
LEFT JOIN(
SELECT *
FROM
RANKING A
LEFT JOIN
raw_data B ON A.DTE = B.DATE
WHERE A.RANKING = '1' ----this is what I want to automate
)B ON A.Employee = B.Employee
GROUP BY
A.DTE
)B ON B.DTE = A.DTE
--COMPARE MONTH RANK 3 AND 2
LEFT JOIN(
SELECT
A.DTE,
SUM(CASE WHEN B.EMPLOYEE IS NULL THEN 1 ELSE 0 END) AS SEPARATIONS
FROM(
SELECT *
FROM
RANKING A
LEFT JOIN
raw_data B ON A.DTE = B.DATE
WHERE A.RANKING = '3'
)A
LEFT JOIN(
SELECT *
FROM
RANKING A
LEFT JOIN
raw_data B ON A.DTE = B.DATE
WHERE A.RANKING = '2'
)B ON A.Employee = B.Employee
GROUP BY
A.DTE
)C ON C.DTE = A.DTE
--COMPARE MONTH RANK 4 AND 3
LEFT JOIN(
SELECT
A.DTE,
SUM(CASE WHEN B.EMPLOYEE IS NULL THEN 1 ELSE 0 END) AS SEPARATIONS
FROM(
SELECT *
FROM
RANKING A
LEFT JOIN
raw_data B ON A.DTE = B.DATE
WHERE A.RANKING = '4'
)A
LEFT JOIN(
SELECT *
FROM
RANKING A
LEFT JOIN
raw_data B ON A.DTE = B.DATE
WHERE A.RANKING = '3'
)B ON A.Employee = B.Employee
GROUP BY
A.DTE
)D ON D.DTE = A.DTE ORDER BY A.DTE DESC
The main problem is how can I automate this to where I'm not explicitly comparing months 2 and 1, and then comparing months 3 and 2, and then comparing months 4 and 3, and so on ?