如何查找可能的连续值并返回该系列的最小值和最大值?

时间:2014-06-02 01:07:42

标签: sql sql-server sql-server-2008 time

我正在制作每周时间表,我想要做的是合并约会,如果它们是连续的并且没有间隙。
例如:我有7:00AM - 08:00AM08:00AM - 03:00PM这是医生的时间表。

换句话说,如何查找具有相同医生和一周中某一天的连续值的所有记录,并返回该开始时间的最小值和该连续集的结束时间的最大值。

是否可以使用SQL检索该数据并将其转换为07:00AM - 03:00PM?如果是这样的话?

我使用SQL Server 2008 R2这是我的示例数据:

enter image description here

2 个答案:

答案 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

请告诉我你的意见。

相关问题