This query works fine there is only one problem and that's his long execution time. Can someone show me some good optimizations and explain them.
SELECT TOP 5 PC.PersonID, P.FirstName, P.LastName, P.A, COUNT(*) Together
FROM PersonCheckIn PC
INNER JOIN Person P ON P.PersonID = PC.PersonID
WHERE CAST(CheckInDate AS DATE) IN (SELECT CAST(CheckInDate AS DATE)
FROM PersonCheckIn C
WHERE C.PersonId = 20) AND
PC.TimeTableID IN (SELECT CIn.TimeTableID
FROM PersonCheckIn CIn
WHERE CIn.PersonId = 20)
AND PC.PersonId <> 20 -- not count same person
GROUP BY PC.PersonId, P.FirstName, P.LastName, P.A
ORDER BY Together DESC;