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
我正在尝试查询 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