通过比较SQL Server中的两行来计算列之间的平均值

时间:2019-03-08 19:24:54

标签: sql sql-server sql-server-2008

我有下表

BidID AppID AppStatus   StatusTime
    1   1   In Review   2019-01-02 12:00:00
    1   1   Approved    2019-01-02 13:00:00
    1   2   In Review   2019-01-04 13:00:00
    1   2   Approved    2019-01-04 14:00:00
    2   2   In Review   2019-01-07 15:00:00
    2   2   Approved    2019-01-07 17:00:00
    3   1   In Review   2019-01-09 13:00:00
    4   1   Approved    2019-01-09 13:00:00

我想要做的是首先通过以下逻辑计算statusTime分钟差的平均值

首先按出价ID分组,然后按AppID分组,然后计算In Review和已批准的AppStatus之间的StatusTime之间的时间差

eg
First Group BidID,Then group App ID

,然后先检查“审核中”状态并找到“下一个批准”状态,然后必须计算日期之间的最小差异

BidID  AppID    AppStatus                                          BidAverage
1 ->   1,2  ->  For App ID 1(2019-01-02       1hour                  1.5
                15:48:42.000 - 2019-01-02 
                12:33:36.000)
                For App ID 2(2019-01-04       2hour
                10:33:12.000 - 2019-01-04 
                10:33:12.000)
2->    2  ->    For App ID 2(2019-01-04       1                       1
                10:33:12.000 - 2019-01-04 
                10:33:12.000)
3->     1->     No Calculation since no Approved           

4->     1->    No Calculation since no In Review before Approved

Final Average (1.5 + 1) / 2 = 1.25 for the table

我已经使用Time Dfference Exluding Weekend建议找出了David's,但不包括星期六的时差。

我不确定如何检查AppStatus是否首先在In Review中,然后是Approved,然后仅计算时间差;如果像BidID 3中一样没有Approved,则不要在平均值计算中使用它,然后取平均值在APPId和BidID之间

谢谢

1 个答案:

答案 0 :(得分:1)

我认为您可以简单地使用min()max()来获取出价/应用对的时间。剩下的只是聚合和更多聚合。

您描述的处理似乎是:

select avg(avg_bid_diff)
from (select bid, avg(diff*1.0) as avg_bid_diff
      from (select bid, appid,
                   datediff(second, min(starttime), max(statustime)) as diff
            from t
            where appstatus in ('In Review', 'Approved')
            group by bid, appid
            having count(*) = 2
           ) ba
      group by bid
     ) b;

做出与提供的数据一致的假设-出价/应用程序对的状态没有重复,并且批准始终在审核之后。