Sql 更新连续3天缺席的个人
使用sql2005。我有三张桌子:会议、联系人和会议联系人 会议表包含以下字段:会议ID、会议名称、开始日期、地点 联系人有:联系人ID、姓名、姓氏、缺勤三天 会议联系人:会议ID,联系人ID 如果个人连续缺席三天(周末除外),我需要更新Missed_Three_Days字段 e、 g.如果他错过了星期五、星期一和星期二,那么“错过三天”字段将在星期二更新 这就是我目前所处的位置。。。我被where语句卡住了Sql 更新连续3天缺席的个人,sql,date,Sql,Date,使用sql2005。我有三张桌子:会议、联系人和会议联系人 会议表包含以下字段:会议ID、会议名称、开始日期、地点 联系人有:联系人ID、姓名、姓氏、缺勤三天 会议联系人:会议ID,联系人ID 如果个人连续缺席三天(周末除外),我需要更新Missed_Three_Days字段 e、 g.如果他错过了星期五、星期一和星期二,那么“错过三天”字段将在星期二更新 这就是我目前所处的位置。。。我被where语句卡住了 update contacts set missed_three_days = 'M
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 ???)
我有一种感觉很明显。。。但今天我的思想并没有指向那个方向
谢谢你的帮助 从臀部拍摄您可以创建一个功能,测试每次错过的会议是否有第二次,然后是同一个人的第三次会议。大概是这样的:
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
这里的好处是,它使用会议桌来确定会议的连续性。。。不是有问题的日历,如周末、节假日、非工作日等
我相信我能想出一个更优雅、更高效的解决方案,但你得给我更多的分数:。也许这至少能让你的创造力源源不断。许多人试图避免像瘟疫这样的功能
另外,您没有提到Sql版本,因此请注意,如果不是2008年,则需要将日期数据类型替换为DateTime。我认为类似的内容可能会满足您的需要
--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
快乐编码 如果其中一天没有开会怎么办?…是不是应该连续缺席三次会议?离今天还有三天,还是任何三天的间隔?如果有的话,是有固定的开始,还是从他们参加会议的第一天开始?谢谢你的提问。拉马克,你是对的,应该连续缺席三次会议,这也可以解释假期里不举行会议的原因。离“今天”还有三天。如果他们在第四天出席,我们会将missed_three_Concertive_meetings字段设置为空。