Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
tSQL:获取从记录创建到第一次接触的平均时间_Sql_Sql Server_Tsql_Average - Fatal编程技术网

tSQL:获取从记录创建到第一次接触的平均时间

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

我有一个CRM数据库,其中包含主表列
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