Обновление лиц, которые отсутствуют 3 дня подряд - PullRequest
0 голосов
/ 27 марта 2012

Использование SQL 2005. У меня есть три таблицы: Meetings, Contacts и Meeting_Contacts.

Таблица собраний имеет следующие поля: Meeting_ID, Meeting_Name, Date_Start, Location

Контакты имеют: Contact_ID, First_Name, Last_Name, Missed_Three_Days

Meeting_Contacts: Meeting_ID, Contact_ID

Мне нужно обновить поле «Missed_Three_Days», если человек пропустил три дня подряд, исключая выходные.

например. Если он пропустил пятницу, понедельник и вторник, поле «Missed_Three_Days» будет обновлено во вторник.

Вот где я сейчас нахожусь ... Я застреваю в утверждении where.

 update contacts set missed_three_days = 'Missed 3 Days' 
 where ID not in 

 (select contact_ID from MEETINGS_CONTACTS mc
  Join meetings m
 on m.id = mc.meeting_id
 join contacts c
 on c.id = mc.contact_ID
 where m.date_start  ???)

У меня есть ощущение, что это очевидно ... но мой разум сегодня не указывает в этом направлении.

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 27 марта 2012

Я думаю, что-то подобное может удовлетворить ваши потребности.

   --select contacts who attended less than 3 of the last 3 meetings
    SELECT 
          contacts.contact_id,
          COUNT(meeting_contacts.meeting_id) as AttendedMeetings
    FROM contacts
    LEFT OUTER JOIN
    (     SELECT TOP 3 
               meetings.meeting_id
           FROM meetings
           ORDER BY meetings.date
    ) as Last3Meetings --the last 3 meetings and their attendees, regardless of when the meeting happened
      LEFT OUTER JOIN meeting_contacts
           ON meetings.meeting_id = meeting_contacts.meeting_id
           AND contacts.contact_id = meeting_contacts.contact_id
HAVING COUNT(contacts.meeting_id) < 3

Счастливого кодирования!

0 голосов
/ 27 марта 2012

Снимая с бедра, вы можете создать функцию, которая проверяет каждую пропущенную встречу на наличие пропавшей 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...