获取创建记录之间的平均时间

时间:2013-10-21 18:17:30

标签: sql sql-server tsql sql-server-2012

所以我有这样的数据:

UserID  CreateDate
1       10/20/2013 4:05
1       10/20/2013 4:10
1       10/21/2013 5:10
2       10/20/2012 4:03

我需要按每个用户分组获取CreateDates之间的平均时间。我想要的结果是这样的:

UserID  AvgTime(minutes)
1       753.5
2       0

如何找到为用户分组返回的所有记录的CreateDates之间的区别?

编辑:

使用SQL Server 2012

6 个答案:

答案 0 :(得分:7)

试试这个:

SELECT  A.UserID,
        AVG(CAST(DATEDIFF(MINUTE,B.CreateDate,A.CreateDate) AS FLOAT)) AvgTime
FROM #YourTable A
OUTER APPLY (SELECT TOP 1 *
             FROM #YourTable
             WHERE UserID = A.UserID
             AND CreateDate < A.CreateDate
             ORDER BY CreateDate DESC) B
GROUP BY A.UserID

答案 1 :(得分:2)

这种方法应该可行。

<强> Fiddle demo here

;WITH CTE AS (
    Select userId, createDate, 
           row_number() over (partition by userid order by createdate) rn
    from Table1
)
select t1.userid, 
       isnull(avg(datediff(second, t1.createdate, t2.createdate)*1.0/60),0) AvgTime
from CTE t1 left join CTE t2 on t1.UserID = t2.UserID and t1.rn +1 = t2.rn
group by t1.UserID;

已更新:感谢@Lemark指出number of diff = recordCount - 1

答案 2 :(得分:2)

因为您使用2012,所以您可以使用lead()来执行此操作

with cte as
(select

         userid,
       (datediff(second, createdate, 
                    lead(CreateDate) over (Partition by userid order by createdate)
                   )/60) datdiff


From table1
)
select 
  userid,
  avg(datdiff) 
from  cte
group by userid

Demo

答案 3 :(得分:0)

这样的事情:

;WITH CTE AS
(
   SELECT
      ROW_NUMBER() OVER (PARTITION BY UserID ORDER BY CreateDate) RN,
      UserID,
      CreateDate
   FROM Tbl
)
SELECT
  T1.UserID,
  AVG(DATEDIFF(mi, ISNULL(T2.CreateDate, T1.CreateDate), T1.CreateDate)) AvgTime
FROM CTE T1
  LEFT JOIN CTE T2
    ON T1.UserID = T2.UserID
      AND T1.RN = T2.RN - 1
GROUP BY T1.UserID

答案 4 :(得分:0)

使用SQL 2012,您可以使用ROW_NUMBER函数和自联接来查找每个组中的“上一行”:

WITH Base AS
(
SELECT 
    ROW_NUMBER() OVER (PARTITION BY UserID ORDER BY CreateDate) RowNum,
    UserId, 
    CreateDate
FROM Users
)
SELECT 
    B1.UserID, 
    ISNULL(
       AVG(
           DATEDIFF(mi,B2.CreateDate,B1.CreateDate) * 1.0
       )
    ,0) [Average]
FROM Base B1
LEFT JOIN Base B2
    ON B1.UserID = B2.UserID
    AND B1.RowNum = B2.RowNum + 1
GROUP BY B1.UserId

虽然我得到了UserID 1的不同答案 - 我得到的平均值为(5 + 1500)/ 2 = 752。

答案 5 :(得分:0)

这仅适用于2012年。您可以使用LEAD分析函数:

CREATE TABLE dates (
  id integer,
  created datetime not null
);

INSERT INTO dates (id, created)
SELECT 1 AS id, '10/20/2013 4:05' AS created
UNION ALL SELECT 1, '10/20/2013 4:10'
UNION ALL SELECT 1, '10/21/2013 5:10'
UNION ALL SELECT 2, '10/20/2012 4:03';

SELECT id, isnull(avg(diff), 0)
FROM (
  SELECT id,
    datediff(MINUTE,
             created,
             LEAD(created, 1, NULL) OVER(partition BY id ORDER BY created)
             ) AS diff
  FROM dates
) as diffs
GROUP BY id;

http://sqlfiddle.com/#!6/4ce89/22

相关问题