SQL Server-重叠数据的累积总和-获取总和达到给定值的日期

问题描述 投票:5回答:3

在我们公司中,我们的客户执行各种我们登录不同表的活动-面试出席,课程出席和其他常规活动。我有一个数据库视图,该视图合并所有这些表中的数据,从而为我们提供了如下所示的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语句来为我提供即时报告。

我正在使用SQL Server 2005。

在我们公司中,我们的客户执行各种我们登录不同表的活动-面试出席,课程出席和其他常规活动。我有一个数据库视图,可以合并数据...

sql-server sql-server-2005 sum overlapping
3个回答
1
投票

这是一种实现方法:


2
投票

请参见SQL Fiddle here


0
投票

一种几何方法

© www.soinside.com 2019 - 2024. All rights reserved.