2012-02-06 97 views
1

之间的数值为下表时一般方法:需要计算行

Id Timestamp AssignedTo 
1  2012-01-01 User1 
2  2012-01-02 User2 
3  2012-01-10 User3 
4  2012-01-15 User1 

这将是在MS SQL Server中的一般方法来计算该实体多少天/小时/分钟分配到一个特定的用户?

作为一名开发人员(拥有基本的SQL知识),我在做这些查询时总是选择函数或存储过程(这类查询包括基于集合中两行之间差异的结果)。

在这个例子中,我将有一个游标迭代项目,保留前一个变量,然后计算差异。不过,我被告知这是一个严重的性能问题,特别是在大型设备上。

编辑:样品结果

User TotalTime 
User1 23d 
User2 8d 
User3 5d 

即项被分配给特定用户的总时间。 User1的总时间为23天,因为自2012-01-15(现在是2012-02-06)以来,User1的总时间已分配给他,并且分配给他的第一天。

+0

根据数据库,可以使用高级SQL功能,那么这是什么数据库?此外,你能提供一些例子输出吗?我不确定你期望得到什么结果... – 2012-02-06 09:19:49

+0

添加了示例数据和MSSQL DBMS。 – grimstoner 2012-02-06 09:45:48

+0

太糟糕了,它是MSSQL/SQL Server,所以你不能使用'ROWS 1 PRECEDING'和类似的窗口函数结构。但在这里看看这个问题,它将包含一些类似问题的答案:http://stackoverflow.com/questions/860966/calculate-a-running-total-in-sqlserver – 2012-02-06 09:48:44

回答

2

在这个例子中,我会使用select语句中的子查询来获取每一行的结束日期,然后使用这个结束日期来获得分配给特定用户的时间。以下是SQL Server语法,但是无论RDBMS如何,都可以应用相同的主体。

SELECT AssignedTo, 
     SUM(DATEDIFF(DAY, TimeStamp, ISNULL(EndDate, GETDATE()))) [Days] 
FROM ( SELECT ID, 
        [TimeStamp], 
        AssignedTo, 
        ( SELECT MIN(TimeStamp) 
         FROM [YOURTABLE] b 
         WHERE b.TimeStamp > a.TimeStamp 
        ) [EndDate] 
      FROM [YOURTABLE] a 
     ) a 
GROUP BY AssignedTo 
+0

+1天才答案! – 2012-02-06 15:43:59

+0

尽管我一直在寻找一种通用的方法,但这个答案让我想起了......我相信所谓的集合论的一个实际例子。 – grimstoner 2012-02-06 18:55:06