【问题标题】:SQL Query AVG Date Time In same Table ColumnSQL查询同一表列中的AVG日期时间
【发布时间】:2015-07-08 20:08:48
【问题描述】:

我正在尝试进行一个查询,该查询返回天数的差异,以获取一段时间内的平均天数。这是我需要从请求中获取状态 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

示例表:

-------------------------------
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
-------------------------------

感谢所有帮助

【问题讨论】:

  • 我通常不会将 DISTINCT 与 GROUP BY 一起使用。取出 DISTINCT 会发生什么?
  • @TheTTGGuy 因为GROUP BY,就其本质而言,是一个DISTINCT,它不会做任何事情。
  • 使用您的样本数据,输出会是什么?据我所知,只有一次用户在同一请求中同时具有状态 2 和 3。
  • 谢谢,你可以使用 1 和 2
  • status需要从status一个status计算到下一个status但是1和2可以工作

标签: sql sql-server max average datediff


【解决方案1】:

您需要使用子查询,因为最小和最大时间的组不同。一个查询将拉取状态为 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

【讨论】:

  • 嗨,谢谢。我尝试查询并在某些情况下有效,但我有数千个请求,结果只显示 25
  • 请求 #146800 是否有数千个请求?那是原始查询的一部分,所以我将其保留为 MinDt 子查询。如果您想扩展结果集,只需将其取出。此外,如果状态还没有状态 3,则它不会出现在结果集中。
  • 那是使用请求#146800的过滤器,我认为是我的数据不正确,让我对我的表进行更深入的研究,但到目前为止显示的记录还可以谢谢
  • 非常感谢您的帮助
【解决方案2】:

像这样? (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

【讨论】:

  • 非常感谢您的帮助
【解决方案3】:

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

编辑:示例

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

您也可以使用 myCTE 进行进一步的连接,选择所需的日期,使用子选择,等等...并且:查看 OVER 链接,可能会有所帮助...

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

【讨论】:

  • 我有 SQL Server 2008
  • 所以你可以将你的查询“包装”为 CTE,我将编辑我的答案给你一个提示......
  • 非常感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多