通过比较 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 对的状态没有重复,批准总是在审查之后。
我有以下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
不包括星期六的时差我已经想通了
我不确定如何检查 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 对的状态没有重复,批准总是在审查之后。