我正在制作每周时间表,我想要做的是合并约会,如果它们是连续的并且没有间隙。
例如:我有7:00AM - 08:00AM
和08:00AM
- 03:00PM
这是医生的时间表。
换句话说,如何查找具有相同医生和一周中某一天的连续值的所有记录,并返回该开始时间的最小值和该连续集的结束时间的最大值。
是否可以使用SQL检索该数据并将其转换为07:00AM - 03:00PM
?如果是这样的话?
我使用SQL Server 2008 R2
这是我的示例数据:
答案 0 :(得分:0)
您好,如果您只想要每位医生每天的最小时数和最长时数,那么这将非常简单:
Select Doctor,DayOfWeek,Min(StartTime),Max(EndTime) from Schedule Group By Doctor,DayOfWeek
但是如果你想考虑可能的差距,那么根本不可能,你无法预测你需要比较多少记录,所以你需要一个算法,而不是用SQL查询来实现。您可以编写存储过程,获取要比较的所有记录并创建所需的输出,但这样会很慢。
我的建议是忘记尝试在数据库上实现这一点,并在前端显示时间表上合并约会的逻辑。即使您设法通过存储过程在数据库服务器上实现它,您的客户(不了解软件要求的医生)会要求您接受半小时的约会,这样的事情会使事情变得更难。
答案 1 :(得分:0)
尝试以下查询:
;WITH GatherDates AS
(
SELECT DocID,
StartTime AppointmentTime
FROM Appointment
UNION ALL
SELECT DocID,
EndTime
FROM Appointment
)
,RemoveDuplicates AS
(
SELECT DocID,
AppointmentTime,
COUNT(*) DuplicateCount
FROM GatherDates
GROUP BY DocID,
AppointmentTime
)
,FindContinuosAppointment AS
(
SELECT DocID,
AppointmentTime,
ROW_NUMBER() OVER(PARTITION BY DocID
ORDER BY AppointmentTime ASC) RN
FROM RemoveDuplicates
WHERE DuplicateCount = 1
)
SELECT ST.DocID,
ST.AppointmentTime StartTime,
ET.AppointmentTime EndTime
FROM FindContinuosAppointment ST
INNER JOIN FindContinuosAppointment ET
ON ST.DocID = ET.DocID
AND ST.RN = ET.RN - 1
AND ST.RN % 2 = 1
AND ET.RN % 2 = 0;
检查我的SQL小提琴链接:http://www.sqlfiddle.com/#!3/04b71/1/0
请告诉我你的意见。