2015-09-18 20 views
0

我有一张包含appointment记录的表,并且用户选择日期范围(begin_date,end_date)。我希望获得落在此日期范围内的appointment以及过去和未来在此日期范围之外(又名,上一次出现和下一次出现)的最接近的实例。获取距离过去和未来最近的实例

我认为最好的方法是使用CTE和自联接,但我接受另一种策略。这是我当前的查询:

WITH present AS 
(SELECT appt.ewssubject, appt.ewsstart::DATE, appt.ewsend::DATE 
FROM appointment appt 
WHERE (appt.ewsstart, appt.ewsend) OVERLAPS (begin_date::DATE, end_date::DATE)) 

SELECT 
present.ewssubject, present.ewsstart, present.ewsend, 
past.ewssubject AS pastsubject, past.ewsstart::DATE AS paststart,past.ewsend::DATE AS pastend, 
future.ewssubject AS futuresubject, future.ewsstart::date AS futurestart, future.ewsend::date AS futureend 

FROM present 
LEFT JOIN appointment AS past USING (ewssubject) 
LEFT JOIN appointment AS future USING (ewssubject) 

WHERE 
present.ewssubject = past.ewssubject AND 
present.ewssubject = future.ewssubject AND 
past.ewsend < present.ewsstart AND 
future.ewsstart > present.ewsend 

ORDER BY present.ewsstart ASC 

我得到了巨大的appointments列表,有很多重复的 - 像这样:

subject start  end   last_start last_end next_start next_end 
DINNER 2015-09-18 2015-09 18 2015-09-17 2015-09-17 2015-09-19 2015-09-19 
DINNER 2015-09-18 2015-09 18 2015-09-17 2015-09-17 2015-09-19 2015-09-19 
... // more repeats! :(

所有我想要做的就是减少重复数量,如下格式:

subject start  end   last_start last_end next_start next_end 
DINNER 2015-09-18 2015-09-18 2015-09-17 2015-09-17 2015-09-19 2015-09-19 
DINNER 2015-09-21 2015-09-21 2015-09-18 2015-09-18 2015-10-02 2015-10-02 
... // and so on 

nb一个appointment可以跨越多天。

我该如何解决我的问题?或者还有另一个我可以写的?

回答

1

你没有输入详细了解您的数据,所以我不知道这是否是一个好主意,但你也许可以用window functions

select 
    ewssubject, ewsstart, ewsend, 
    lag(ewsstart) over (partition by ewssubject order by ewstart) prior_start, 
    lag(ewsend) over (partition by ewssubject order by ewstart) prior_end, 
    lead(ewsstart) over (partition by ewssubject order by ewstart) next_start, 
    lead(ewsend) over (partition by ewssubject order by ewstart) next_end 
from appointment 
order by ewstart; 
+0

这个作品! sorta ...我怎么能让用户选择的'begin_date'和'end_date'使'before'和'next'的日期无界限?目前这只适用于如果下一个和上一个事件也发生在指定日期范围内 – yiwei

+0

ahhh没关系我只是subqueried它 – yiwei