SQL-计算时间差异的平均值

时间:2018-05-22 09:31:25

标签: sql-server

我有一个sql表,其中包含所有客户端的事务历史记录。我想找出两次交易之间的平均时差。

ClientCode      Date
DL2xxx          2016-04-18 00:00:00.000
DL2xxx          2016-04-18 00:00:00.000
E19xxx          2016-04-18 00:00:00.000
E19xxx          2016-04-18 00:00:00.000
E19xxx          2016-04-18 00:00:00.000
JDZxxx          2016-04-18 00:00:00.000

以上是表格的前几行,给出的日期是交易发生的日期。我希望在连续交易发生的几天内取平均值。对于客户说,他进行第1天,第3天,第10天和第15天的交易。因此差异是{2,7,7}平均值为4.66。如果只发生一次交易,则该值应为0.

ClientCode AverageDays
DL2xxx     <float_value>
DL2xxx     <float_value>
E19xxx     <float_value>

这就是每个唯一客户端代码只出现一次的输出。

4 个答案:

答案 0 :(得分:2)

如果表名为T,则可以使用如下所示的查询 see live demo

select 
ClientCode, 
AvgDays =ISNULL(AVG(d),0)
from
(
    select 
        *, 
        d=DATEDIFF(
                d,
                dateofT,
                LEAD(DateofT) over( 
                        partition by ClientCode 
                        order by DateofT asc )) 
    from t
)t
group by ClientCode

答案 1 :(得分:1)

您可以使用services.AddDbContext<MyOwnDbContext>( ops => ops.UseSqlite(connection, optionsBuilder => optionsBuilder.MigrationsAssembly("MyProject.API"))); 功能将客户的日期与之前的日期进行比较,然后按客户分组并计算平均值。

LAG()

答案 2 :(得分:1)

如果您无法使用窗口功能,可以选择

--CREATE SAMPLE DATA
CREATE TABLE #TMP(ClientID INT, EventDate DATE)
GO

INSERT INTO #TMP VALUES
(1,DATEADD(DD,RAND()*365,'20180101'))
,(2,DATEADD(DD,RAND()*365,'20180101'))
,(3,DATEADD(DD,RAND()*365,'20180101'))
,(4,DATEADD(DD,RAND()*365,'20180101'))
,(5,DATEADD(DD,RAND()*365,'20180101'))
GO 50


--PRE SQL 2012 Compatible
SELECT A.ClientID
        ,AVG(DATEDIFF(DD,C.EventDate,A.Eventdate)) AS ClientAvg

 FROM #TMP A
    CROSS APPLY (SELECT ClientID, MAX(EventDate) EventDate FROM #TMP B
                    WHERE A.ClientID = B.ClientID AND A.EventDate > B.EventDate
                    GROUP BY ClientID) C
GROUP BY A.ClientID
ORDER BY A.ClientID

答案 3 :(得分:0)

使用观察到组内差异的总和只是该组的browser.runtime.onMessage.addListener(function (message) { data = message.data; // do stuff }); ,您可以通过选择使用简单组:

max - min