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

Calculate Average between columns by comparing two rows in SQL Server

我有以下table

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 分钟差异的平均值

先按BidID分组,再按AppID分组,然后计算In Review和AppStatus Approved的StatusTime时间差

eg
First Group BidID,Then group App ID

,然后首先检查 In Review 状态并找到下一个 Approved 状态,然后必须计算日期之间的最小差异

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

不包括星期六的时差我已经想通了 using David's建议

我不确定如何检查 AppStatus 是否先在 In Review 中然后在 Approved 中,然后只计算时间差,如果没有像 BidID 3 中那样 Approved 则不要在平均计算中使用它,并且然后对 APPId 和 BidID

进行平均

谢谢

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

您描述的处理过程似乎是:

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;

这做出了与提供的数据一致的假设 -- bid/app 对的状态没有重复,批准总是在审查之后。