假设我有一个包含一系列信息请求的表,我们将其称为requests
:
| key | Individual | Date | Due date |
| 0 | 1 | 2019-01-01 | 2019-01-10 |
| 1 | 2 | 2019-01-02 | 2019-01-11 |
| 2 | 2 | 2019-01-03 | 2019-01-11 |
这些请求行中的每个行都将通知用户有关完成任务的要求(任务无关紧要)。他们完成任务后,将在另一表中输入一行,称为completions
。
| key | Individual | Date |
| 10 | 1 | 2018-12-28 |
| 11 | 2 | 2019-01-05 |
| 12 | 2 | 2019-01-06 |
如果任务完成(由个人完成)的日期比请求的日期大 ,则认为请求已得到满足。只要请求的日期比完成的日期短(即,请求在任务完成之前进入),一次完成将解决该用户的所有未完成的请求。
最终,我想要创建一个视图,以记录完成每个请求所需的时间,无论是从发出请求以来的天数,到截止日期还有多少天(或逾期多少天。
为了实现这一目标,我认为我需要一个中间视图,告诉我哪个完成可以满足每个请求(如果有的话)
所以我想要一个生成以下内容的查询:
| RequestKey | CompletedBy |
| 0 | NULL |
| 1 | 11 |
| 2 | 11 |
因为完成10是在发出请求之前发生的,所以从未填充过请求0。请求1和2都由完成11填充,因为这是在每个请求发出之后发生的第一个完成。
从这里转到最终视图,该视图告诉我完成请求所需的时间,逾期时间等。这很容易,因为我可以对表进行联接并计算完成日期之间的差额和请求日期,但对我来说还不太清楚如何到达上表。
答案 0 :(得分:1)
您可以使用outer apply
获取每个请求的完成日期:
select r.*, c.date as completion_date,
datediff(day, r.date, c.date) as days_to_completion
from requests r outer apply
(select top (1) c.*
from completions c
where c.individual = r.individual and
c.date >= r.date
order by c.date desc
) c;