tSQL:获取从记录创建到第一次接触的平均时间
我有一个CRM数据库,其中包含主表列tSQL:获取从记录创建到第一次接触的平均时间,sql,sql-server,tsql,average,Sql,Sql Server,Tsql,Average,我有一个CRM数据库,其中包含主表列createon(date)和createat(time)。我们称之为A桌 有一个辅助表,用于记录有关试图联系在a中创建的记录时所采取的活动的数据,我们称此表为B 我正在尝试编写一个tSQL查询,它将显示在a中创建记录与在B中记录第一个活动之间的平均时间 这就是我到目前为止所做的: SELECT B.userid, avg(cast(datediff(MINUTE, A.createat, B.ontime) as float)) A
createon
(date
)和createat
(time
)。我们称之为A桌
有一个辅助表,用于记录有关试图联系在a中创建的记录时所采取的活动的数据,我们称此表为B
我正在尝试编写一个tSQL查询,它将显示在a中创建记录与在B中记录第一个活动之间的平均时间
这就是我到目前为止所做的:
SELECT
B.userid,
avg(cast(datediff(MINUTE, A.createat, B.ontime) as float))
AS 'AVG TIME FROM LEAD CREATION TO FIRST LOGGED ACTIVITY'
FROM
TableA A, TableB B
WHERE
A.KEY_value = B.KEY_value
AND B.USERID in ('USER1','USER2','USER3','USER4','USER5')
AND B.ONDATE > '09/01/2014'
GROUP BY
B.USERID
HAVING
B.ontime = min(B.ontime)
如果我删除'having'子句,查询将起作用,但是我不能确定是否得到表B中第一个记录的活动的时间(min(B.ontime))
我仍然是一个SQL新手,因此对此的任何帮助/指导都将不胜感激 一种方法是为子查询中的每个用户获取最小时间,并与表a联接
SELECT
T.userid,
ISNULL(avg(cast(datediff(MINUTE, cast(A.createat as datetime)+A.createdon, T.MinOnTime) as float)),0)
AS [AVG TIME FROM LEAD CREATION TO FIRST LOGGED ACTIVITY]
FROM
TableA A
LEFT JOIN ( SELECT Key_value, userid, min(cast(B.ontime as datetime) + B.ondate) as MinOnTime FROM
TableB B
WHERE B.USERID in ('USER1','USER2','USER3','USER4','USER5')
AND B.ONDATE > '09/01/2014'
GROUP BY KEY_Value, userid
) T
on A.KEY_value = T.KEY_value
GROUP BY T.userid
-在ANSI-92 SQL标准(20多年前)中,旧式的逗号分隔的表列表样式被正确的ANSI
JOIN
语法所取代,并且它的使用非常简单discouraged@marc_s很高兴知道。谢谢。@marc_s:被谁劝阻了?被任何喜欢让查询变得易懂的人劝阻了。使用ANSI联接有几个原因:可移植性、对联接与过滤的更好控制、使用多个外部联接时更少的歧义以及使用联合联接的能力。在我最后添加了GROUP by子句之后,这似乎起到了作用,但我有一个聚合值为负值的用户。如果用户没有在与A.createon日期相同的日期在B中记录活动,我该如何解释?如果Op的平均值为负,这不意味着Op键没有正确排列时间吗?在创建时间之前,第一个记录的活动是如何创建的?@RADAR我可以将a.createon+a.createat作为[CreateDateTime](以分钟为单位)和T.MinOnDate+T.MinOnTime作为[MinOnDateTime](以分钟为单位)相加,并使用ISNULL中的变量(avg(cast(datediff(MINUTE,CreateDateTime,MinOnDateTime)作为float)),0)@lookslikeanevo我认为我们需要考虑createon日期和活动ondate…(见上文)@jer_bear,是ontime整数还是日期时间,它只存储时间成分还是分钟我必须考虑createon日期和ondate。createat&ontime时间存储为varchar()值,而ondate和createon日期存储为datetime()。我可以有一个createat时间为[13:00]的记录(即该记录是在下午1:00创建的),但第二天的时间为[12:00](即第一个记录的活动直到第二天下午12:00才被记录)。在这种情况下,我最终会得到一个负的聚合值。必须考虑datetime()字段。@jer_bear ok得到了……很快将进行修改,只需添加一个案例statement@lookslikeanevo仅供参考,您可以删除答案,使其在修改时不会显示,然后在完成修改后将其取消删除。@jer_bear您有任何样本数据,我们可以测试输出?@lookslikeanevo否,不幸的是我没有。即使我有,我也不知道怎么才能给你弄到。我是否可以从表A和表B中选择*前x行数并将其发送给您?
SELECT
t.userid
,case when A.createon = B.ondate then avg(cast(datediff(MINUTE, A.createat, B.ontime) as float))
else avg(datediff(MINUTE, A.createon, B.ondate)+(cast(datediff(MINUTE, A.createat, B.ontime) as float)))
end as 'AVG TIME FROM LEAD CREATION TO FIRST LOGGED ACTIVITY'
FROM
TableA a
LEFT JOIN ( SELECT Key_value, userid, min(B.ontime) as MinOnTime
FROM TableB b
WHERE b.USERID in ('USER1','USER2','USER3','USER4','USER5')
and b.ondate > '2014/09/01'
GROUP BY KEY_Value, userid) t on a.KEY_value = t.KEY_value
GROUP BY
t.userid
SELECT
B.userid,
avg(cast(datediff(MINUTE, A.createat, min(B.ontime)) as float))
AS 'AVG TIME FROM LEAD CREATION TO FIRST LOGGED ACTIVITY'
FROM
TableA A, TableB B
WHERE
A.KEY_value = B.KEY_value
AND B.USERID in ('USER1','USER2','USER3','USER4','USER5')
AND B.ONDATE > '09/01/2014'
GROUP BY
B.USERID