使用OVER PARTITION BY的问题

时间:2015-08-27 08:42:45

标签: sql sql-server tsql window-functions

使用ROW_NUMBER() OVER (PARTITION BY ...).

时遇到了一些问题

我有下表

StartTime | EndTime | ContractStart
----------+---------+--------------
10:00     |  12:00  | 2015-03-02
11:00     |  22:00  | 2014-01-02
10:00     |  12:00  | 2015-03-02
10:00     |  12:00  | 2014-01-02

此人与2014-01-02签订了工作合同。合同中的某些内容发生了变化,他在2015-03-02得到了一个新的合同。现在我想总结一下新合同的工作时间。我的代码是:

SELECT 
    SUM(DATEDIFF(Minute, table.StartTime, table.EndTime))
FROM
    (SELECT 
         *, 
         ROW_NUMBER() OVER (PARTITION BY ContractStart 
                            ORDER BY ContractStart DESC) AS seqnum
     FROM table) table
WHERE 
    seqnum = 1

我实际上认为代码会将表分成两个分区。一个与每个合同的数据。现在每个分区都有一个数字。由于我设置了ORDER BY ContractStart DESC,因此最新的合同位于我在查询的Where Clause中选择的第一个分区中。我的结果总是0,我不知道代码有什么问题。任何人都可以告诉代码有什么问题,以及为什么它没有产生我想要的结果。

1 个答案:

答案 0 :(得分:1)

另一种方法(取决于您所需的输出)。

SELECT ContractStart, SUM(DATEDIFF(Minute, StartTime, EndTime)) AS WorkingTime
FROM yourtable
GROUP BY ContractStart

输出:

ContractStart               WorkingTime
January, 02 2014 00:00:00   780
March, 02 2015 00:00:00     240

SQL小提琴:http://sqlfiddle.com/#!3/7d539/4/0

我还会假设这将是更大查询的一部分(包括某种类型的员工ID),这些查询可以包含在选择和分组中。

<强>伪

SELECT e.id, c.ContractStart, SUM(DATEDIFF(Minute, c.StartTime, c.EndTime)) AS WorkingTime
FROM contracts c
INNER JOIN employee e ON c.employeeid = e.id
GROUP BY e.id, c.ContractStart