SQL 在同一 Table 列中查询 AVG 日期时间

SQL Query AVG Date Time In same Table Column

我正在尝试查询 returns 天数差异以获得一段时间内天数的平均值。在这种情况下,我需要从请求中获取状态 2 的最大日期和状态 3 的最大日期,并获取用户在该时间段花费的时间

到目前为止,这是我现在的查询,我得到了 mas 和 min 以及天数之间的差异,但不是状态 2 的最大值和状态 3 的最大值

我目前的查询:

SELECT distinct t1.user, t1.Request,
       Min(t1.Time) as MinDate, 
       Max(t1.Time) as MaxDate, 
       DATEDIFF(day, MIN(t1.Time), MAX(t1.Time))
FROM [Hst_Log]  t1
      where t1.Request = 146800
GROUP BY  t1.Request, t1.user
ORDER BY t1.user, max(t1.Time) desc

示例table:

-------------------------------
user | Request | Status | Time
-------------------------------
User 1 | 2 | 1 | 6/1/15 3:25 PM
User 2 | 1 | 1 | 2/1/15 3:24 PM
User 2 | 3 | 1 | 2/1/15 3:24 PM
User 1 | 4 | 1 | 5/10/15 3:18 PM
User 3 | 3 | 2 | 5/4/15 2:36 PM
User 2 | 2 | 2 | 6/4/15 2:34 PM
User 3 | 2 | 3 | 6/10/15 5:51 PM
User 1 | 1 | 2 | 5/1/15 5:49 PM
User 3 | 4 | 2 | 5/16/15 2:39 PM
User 2 | 4 | 2 | 5/17/15 2:32 PM
User 2 | 3 | 2 | 4/6/15 2:22 PM
User 2 | 3 | 3 | 4/7/15 2:06 PM
-------------------------------

我会感谢所有的帮助

SQL-服务器版本是什么?也许您可以将查询用作 CTE 并进行后续操作 SELECT,您可以在其中使用最小和最大日期作为日期期间。

编辑:示例

WITH myCTE AS
(
put your query here
)
SELECT * FROM myCTE

您也可以使用 myCTE 进行进一步的连接,选择所需的日期,使用 sub-select,无论什么...并且:看看 OVER-link,可以有帮助...

根据版本,您还可以考虑使用 OVER https://msdn.microsoft.com/en-us/library/ms189461.aspx

像这样的? (mysql)

SELECT t.*,MAX(t.UFecha), x.*,y.*,Min(t.UFecha) as MinDate, 
       Max(t.UFecha) as MaxDate, 
       avg(x.Expr2+y.Expr3),//?????
       DATEDIFF(MIN(t.UFecha), MAX(t.UFecha)) AS Expr1 

FROM `app_upgrade_hst_log` t

left join(select count(*),Request, DATEDIFF(MIN(UFecha), MAX(UFecha)) AS Expr2 FROM `app_upgrade_hst_log` where Status=1 group by Request,Status) x on t.Request= x.Request

left join(select count(*),Request, DATEDIFF(MIN(UFecha), MAX(UFecha)) AS Expr3 FROM `app_upgrade_hst_log` where Status=2) y on t.Request= y.Request

group by t.Request,t.Status

您需要使用子查询,因为最短时间和最长时间的组不同。一个查询将提取状态为 2 的最小值。另一个查询将提取状态为 3 的最大值。

像这样:

SELECT MinDt.[User], minDt.MinTime, MaxDt.MaxTime, datediff(d,minDt.MinTime, MaxDt.MaxTime) as TimeSpan
FROM

(SELECT t1.[user], t1.Request,
       Min(t1.Time) as MinTime
FROM [Hst_Log]  t1
      where t1.Request = 146800
      and t1.[status] = 2
GROUP BY  t1.Request, t1.[user]) MinDt

INNER JOIN

(SELECT t1.[user], t1.Request,
       Max(t1.Time) as MaxTime      
FROM [Hst_Log]  t1
      where t1.[status] = 3
GROUP BY  t1.Request, t1.[user]) MaxDt

ON MinDt.[User] = MaxDt.[User] and minDt.Request = maxDt.Request