Снимая с бедра, вы можете создать функцию, которая проверяет каждую пропущенную встречу на наличие пропавшей 2-й, а затем 3-й встречи одного и того же человека.Примерно так:
CREATE FUNCTION MissedThree
(
@pContact_ID int,
@pKeyDate Date
)
RETURNS Bit
AS
BEGIN
DECLARE @pReturnValue Bit = 0 /** FALSE UNTIL PROVEN OTHERWISE */
/** DID CONTACT MISS THIS MEETING? */
IF NOT Exists
(SELECT Meetings.Meeting_ID FROM
Meeting_Contacts INNER JOIN Meetings
ON Meetings.Meeting_ID = Meeting_Contacts.Meeting_ID
WHERE Contact_ID = @pContact_ID AND Meetings.Date_Start = @pKeyDate)
BEGIN
/** CHECK TO SEE IF NEXT WAS ALSO MISSED */
DECLARE @pMeetingTwo Date
SELECT @pMeetingTwo = MAX(Date_Start)
FROM Meetings WHERE Date_Start > @pKeyDate;
IF NOT Exists
(SELECT Meetings.Meeting_ID FROM
Meeting_Contacts INNER JOIN Meetings
ON Meetings.Meeting_ID = Meeting_Contacts.Meeting_ID
WHERE Contact_ID = @pContact_ID AND Meetings.Date_Start = @pMeetingTwo)
BEGIN
/** CHECKT TO SEE IF A THIRD CONSECUTIVE WAS MISSED */
DECLARE @pMeetingThree Date
SELECT @pMeetingThree = MAX(Date_Start)
FROM Meetings WHERE Date_Start > @pMeetingTwo;
IF NOT Exists
(SELECT Meetings.Meeting_ID FROM
Meeting_Contacts INNER JOIN Meetings
ON Meetings.Meeting_ID = Meeting_Contacts.Meeting_ID
WHERE Contact_ID = @pContact_ID AND Meetings.Date_Start = @pMeetingThree)
BEGIN
SET @pReturnValue = 1
END
END
END
RETURN @pReturnValue;
END
Оттуда вам просто нужно будет выполнить запрос, чтобы определить виновных.
SELECT Contact_ID, Start_Date FROM
Meeting_Contacts INNER JOIN Meetings
ON Meetings.Meeting_ID = Meeting_Contacts.Meeting_ID
WHERE dbo.MissedThree(Contact_ID, Start_Date) = 1
Приятно то, что он использует таблицу собраний для определения последовательного характера собраний ... а не календарь, который может иметь проблемы, такие как выходные, праздничные дни, нерабочие дни и т. Д.
Я уверен, что мог бы придумать более элегантное и более эффективное решение, но вам пришлось бы платить мне больше, чем SO очков :).Возможно это заставляет Ваши творческие соки течь по крайней мере.Множество людей стараются избегать таких функций, как чума.
Кроме того, вы не упомянули версию Sql, поэтому имейте в виду, что если это не 2008, тип данных Date необходимо будет поменять местами для DateTime.