【发布时间】:2015-06-04 10:21:52
【问题描述】:
在我们公司,我们的客户执行我们登录不同表格的各种活动 - 面试出勤、课程出勤和其他一般活动。 我有一个数据库视图,它结合了所有这些表中的数据,为我们提供了看起来像这样的 ActivityView。 您可以看到一些活动重叠 - 例如,在参加面试时,客户可能一直在执行简历更新活动。
+----------------------+---------------+---------------------+-------------------+
| activity_client_id | activity_type | activity_start_date | activity_end_date |
+----------------------+---------------+---------------------+-------------------+
| 112 | Interview | 2015-06-01 09:00 | 2015-06-01 11:00 |
| 112 | CV updating | 2015-06-01 09:30 | 2015-06-01 11:30 |
| 112 | Course | 2015-06-02 09:00 | 2015-06-02 16:00 |
| 112 | Interview | 2015-06-03 09:00 | 2015-06-03 10:00 |
+----------------------+---------------+---------------------+-------------------+
每个客户都有一个“注册日期”,记录在客户表上,这是他们加入我们计划的时间。这是我们的示例客户端:
+-----------+---------------------+
| client_id | client_sign_up_date |
+-----------+---------------------+
| 112 | 2015-05-20 |
+-----------+---------------------+
我需要创建一个显示以下列的报告:
+-----------+---------------------+--------------------------------------------+
| client_id | client_sign_up_date | date_client_completed_5_hours_of_activity |
+-----------+---------------------+--------------------------------------------+
我们需要这份报告来了解我们的计划的效果。该计划的一个重要目标是让每个客户尽快完成至少 5 小时的活动。 所以这份报告会告诉我们每个客户从注册到达到这个数字需要多长时间。
更棘手的是,当我们计算 5 小时的总活动时,我们必须扣除重叠的活动:
在上面的示例数据中,客户在 09:00 到 11:00 之间参加了面试。
同一天,他们还在09:30到11:30进行了简历更新活动。
对于我们的计算,这将为他们提供 2.5 小时(150 分钟)的总活动时间 - 我们只计算 30 分钟的简历更新,因为面试与 11:00 重叠。
因此,我们的示例客户端的报告将给出以下结果:
+-----------+---------------------+--------------------------------------------+
| client_id | client_sign_up_date | date_client_completed_5_hours_of_activity |
+-----------+---------------------+--------------------------------------------+
| 112 | 2015-05-20 | 2015-06-02 |
+-----------+---------------------+--------------------------------------------+
所以我的问题是如何使用 select 语句创建报告? 我可以通过编写一个存储过程来解决这个问题,该过程将遍历视图并将结果写入报告表。 但我更愿意避免使用存储过程,并使用一个 select 语句来即时为我提供报告。
我使用的是 SQL Server 2005。
【问题讨论】:
-
我们可以假设没有任何时期精确相互重叠吗?
-
@Damien。这种可能性很小,但我认为如果这意味着我们在 99.99% 的时间里都能获得正确的数据,我们现在可以忽略这一点,
标签: sql-server sql-server-2005 sum overlapping