【问题标题】:How to Combine a query with a AVG query when using datetime SQL 2008 R2使用日期时间 SQL 2008 R2 时如何将查询与 AVG 查询结合使用
【发布时间】:2013-11-26 12:20:26
【问题描述】:

我正在尝试将两个查询组合在一起,但我遇到了麻烦,因为它是一个日期时间列。现在我有一个查询可以找到所有用户+那里最慢和最快的“段”时间,但我还需要找到下面的平均段时间是我现在使用的两个查询,哪个工作但我需要它在一个查询我正在制作的报告。

谢谢

托马斯·詹姆斯

DECLARE 
@vnuID int = 1212,
@StartDate DateTime = '30/10/2013',
@EndDate DateTime = '26/11/2013'

SELECT DISTINCT usrFullName, MIN(CAST(tblTrace.trFinish - tblTrace.trStart AS TIME)) AS FastestUserSegmentTime,  
        MAX(CAST(tblTrace.trFinish - tblTrace.trStart AS TIME)) AS SlowestUserSegmentTime 
FROM tblTrace 
    INNER JOIN tblUsers ON usrID = tr_usrID
WHERE tr_vnuID = @vnuID AND trFinish IS NOT NULL AND tr_usrID IS NOT NULL AND trObjectType LIKE 'Segment%'  
        AND trStart BETWEEN @StartDate AND @EndDate 
GROUP BY usrFullName


SELECT AVG(TotalTime) AS AvgUserSegmentTime 
FROM (SELECT DateDiff(SECOND, tblTrace.trStart , tblTrace.trFinish) as 'TotalTime' 
        FROM tblTrace
        WHERE tblTrace.trFinish IS NOT NULL AND tblTrace.trObjectType LIKE 'Segment%' AND tblTrace.tr_vnuID = @vnuID 
        AND tblTrace.trStart BETWEEN @StartDate AND @EndDate ) as SubQuery  

【问题讨论】:

    标签: sql-server datetime average


    【解决方案1】:

    在功能上(即没有优化)你可以使用这样的东西:

    DECLARE 
    @vnuID int = 1212,
    @StartDate DateTime = '30/10/2013',
    @EndDate DateTime = '26/11/2013'
    
    SELECT usrFullName, FastestUserSegmentTime, SlowestUserSegmentTime,
           (SELECT AVG(DateDiff(SECOND, tblTrace.trStart , tblTrace.trFinish)) 
            FROM tblTrace
            WHERE tblTrace.trFinish IS NOT NULL AND tblTrace.trObjectType LIKE 'Segment%' AND tblTrace.tr_vnuID = @vnuID 
            AND tblTrace.trStart BETWEEN @StartDate AND @EndDate) as AvgUserSegmentTime
    FROM (
        SELECT usrFullName, 
               MIN(CAST(tblTrace.trFinish - tblTrace.trStart AS TIME)) AS FastestUserSegmentTime,  
               MAX(CAST(tblTrace.trFinish - tblTrace.trStart AS TIME)) AS SlowestUserSegmentTime 
        FROM tblTrace 
            INNER JOIN tblUsers ON usrID = tr_usrID
        WHERE tr_vnuID = @vnuID AND trFinish IS NOT NULL AND tr_usrID IS NOT NULL AND trObjectType LIKE 'Segment%'  
                AND trStart BETWEEN @StartDate AND @EndDate 
        GROUP BY usrFullName
    ) coreData
    

    但是,我假设您希望tr_usrID 在所有情况下都不为空?在这种情况下,您可以使用它:

    SELECT usrFullName, 
           CONVERT(TIME, DATEADD(s, MIN(SegmentTime))) as FastestUserSegmentTime,
           CONVERT(TIME, DATEADD(s, MAX(SegmentTime))) as SlowestUserSegmentTime,
           AVG(SegmentTime) as AvgUserSegmentTime
      FROM (
        SELECT usrFullName, 
               DateDiff(SECOND, tblTrace.trStart, tblTrace.trFinish) as SegmentTime
          FROM tblTrace INNER JOIN
               tblUsers  
            ON usrID = tr_usrID
         WHERE tr_vnuID = @vnuID 
           AND trFinish IS NOT NULL 
           AND tr_usrID IS NOT NULL 
           AND trObjectType LIKE 'Segment%'  
           AND trStart BETWEEN @StartDate AND @EndDate 
           ) coreData
    

    【讨论】:

      猜你喜欢
      • 2017-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多