Sql 每个时间段和用户只返回聚合函数的一行

Sql 每个时间段和用户只返回聚合函数的一行,sql,sql-server,aggregate-functions,row-number,Sql,Sql Server,Aggregate Functions,Row Number,我正在使用SQLServer2008 我用以下方法构建了表: Date (datetime) TimeIn (datetime) TimeOut (datetime) UserReference (nvarchar) LocationID 我想要的结果是:在早上7点到下午18点6分之间的每一个小时,我想知道每个位置的超时时间最高的用户-最后一个条件是可选的- 所以我有一个聚合函数,它计算TimeOut和TimeIn之间的datediff,以秒为单位,别名为Total 我希望我的结果看起来有点

我正在使用SQLServer2008

我用以下方法构建了表:

Date (datetime)
TimeIn (datetime) 
TimeOut (datetime)
UserReference (nvarchar)
LocationID
我想要的结果是:在早上7点到下午18点6分之间的每一个小时,我想知道每个位置的超时时间最高的用户-最后一个条件是可选的-

所以我有一个聚合函数,它计算TimeOut和TimeIn之间的datediff,以秒为单位,别名为Total

我希望我的结果看起来有点像这样:

Hour 7 | K1345 | 50 | Place #5
Hour 7 | K3456 | 10 | Place #4
Hour 8 | K3333 | 5  | Place #5
等等

到目前为止,我所尝试的:

使用ROW_NUMBER函数的CTE,按我的聚合列进行分区并按它排序。这只返回一行

在CTE中,我进行所有聚合,包括dateparthour、date,并使用最大聚合来获取外部查询中的最高总时间

我知道我必须以某种方式使用CTE,我只是不确定如何加入CTE和我的外部查询

我使用的行号或排名是否正确

我尝试过的问题:

WITH cte as 
(
SELECT * ,
       rn = ROW_NUMBER() over (partition by datediff(second, [TimeIn], [TimeOut])order by datediff(second, [TimeIn], [TimeOut]) desc)
FROM TimeTable  (nolock)
where DateCreated > '20131023 00:00:00' and DateCreated < '20131023 23:59:00'    
)
SELECT  datepart(hour,cte.DateCreated) as hour,cte.UserReference,(datediff(second, [TimeIn], [TimeOut])) as [Response Time],LocationID
from cte
where cte.rn = 1
and  DATEPART(hh,datecreated) >= 7 and DATEPART(hh,datecreated) <= 18
order by hour asc
with cte as 
(
SELECT Datecreated as Date,
       UserReference as [User],
       datediff(second, [TimeIn], [TimeOut]) as Time,
       LocationID as Location
FROM TimeTable
WHERE datecreated... --daterange
)
SELECT DATEPART(HOUR,date), cte.[User], MAX(Time), Location
FROM cte
WHERE  DATEPART(hh,datecreated) >= 7 and DATEPART(hh,datecreated) <= 18
GROUP BY DATEPART(HOUR,date), cte.[User], Location
我希望这会有所帮助

   WITH TotalTime AS (
        SELECT  
            CAST(DateCreated AS DATE) as [date] 
            ,DATEPART(hour,DateCreated) AS [hour]
            ,SUM(DATEDIFF(second,TimeIn,TimeOut)) AS Total
            ,UserReference 
            ,locationid
        FROM    TimeTable
        GROUP BY UserReference,locationid,CAST(DateCreated AS DATE),DATEPART(hour,DateCreated) 
        HAVING DATEPART(hh,DateCreated) >= 7 and DATEPART(hh,DateCreated) <= 18
    )
    , rn AS (
        SELECT *, ROW_NUMBER() OVER (PARTITION BY [date],[hour],locationid ORDER BY Total DESC) AS row_num
        FROM TotalTime
    )
    SELECT *
    FROM rn 
    WHERE row_num = 1

请发布您已经尝试过的查询。另外,请添加几行示例数据,从中可以获得所需的结果。
   WITH TotalTime AS (
        SELECT  
            CAST(DateCreated AS DATE) as [date] 
            ,DATEPART(hour,DateCreated) AS [hour]
            ,SUM(DATEDIFF(second,TimeIn,TimeOut)) AS Total
            ,UserReference 
            ,locationid
        FROM    TimeTable
        GROUP BY UserReference,locationid,CAST(DateCreated AS DATE),DATEPART(hour,DateCreated) 
        HAVING DATEPART(hh,DateCreated) >= 7 and DATEPART(hh,DateCreated) <= 18
    )
    , rn AS (
        SELECT *, ROW_NUMBER() OVER (PARTITION BY [date],[hour],locationid ORDER BY Total DESC) AS row_num
        FROM TotalTime
    )
    SELECT *
    FROM rn 
    WHERE row_num = 1