我有一个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>
这就是每个唯一客户端代码只出现一次的输出。
答案 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