Вот решение для MSSQL.
Показывает отрицательное значение, если кредит сократился в течение периода времени.
У него есть несколько внутренних соединений, и, вероятно, его можно оптимизировать, но, вероятно, ненамного
SELECT maxCredit.employeeID, maxCredit.creditAmount - minCredit.creditAmount
FROM
(
SELECT
ep.employeeID, rc.creditAmount
FROM
EmployeePunch ep
INNER JOIN
ResponderCredit rc
ON rc.employeeID = ep.employeeID AND rc.punchdate = rc.creditdate
INNER JOIN
(
SELECT ep2.employeeID, MAX(ep2.punchdate) AS maxCreditdate
FROM EmployeePunch ep2 GROUP BY ep2.employeeID
) innermax
ON innermax.employeeID = ep.employeeID AND ep.punchdate = innermax.maxcreditDate
) maxCredit
INNER JOIN
(
SELECT
ep.employeeID, rc.creditAmount
FROM
EmployeePunch ep
INNER JOIN
ResponderCredit rc
ON rc.employeeID = ep.employeeID AND rc.punchdate = rc.creditdate
INNER JOIN
(
SELECT ep3.employeeID, MIN(ep3.punchdate) AS minCreditdate
FROM EmployeePunch ep3 GROUP BY ep3.employeeID
) innermin
ON innermin.employeeID = ep.employeeID AND ep.punchdate = innermin.mincreditDate
) minCredit
ON maxCredit.employeeID = minCredit.employeeID