达到给定数量所需的平均记录数

时间:2014-09-22 15:12:45

标签: sql sql-server

我正在尝试计算达到给定数字所需的平均条目数。将其视为销售环境:数据库中的每条记录都表示已拨打电话。其中一列中有一个标记表示是否进行了销售。我已经创建了一些东西,它将返回达到给定数字所需的条目数,但是,我希望它在达到该数字后“重置”然后再次开始计数,依此类推,直到所有数据都已存在检查。

表格如下所示:

UID | DATE       | TIME     | NAME1 | SUBNAME1 | SUCCESS? |
1   | 01/01/2014 | 09:00:00 | Test1 | SubTest1 | 0        |
2   | 01/01/2014 | 09:01:00 | Test1 | SubTest1 | 1        |
3   | 01/01/2014 | 09:02:00 | Test1 | SubTest1 | 0        |
4   | 01/01/2014 | 09:03:00 | Test1 | SubTest1 | 1        |
5   | 01/01/2014 | 09:04:00 | Test1 | SubTest1 | 1        |
6   | 01/01/2014 | 09:05:00 | Test1 | SubTest1 | 1        |
7   | 01/01/2014 | 09:06:00 | Test1 | SubTest1 | 0        |
8   | 01/01/2014 | 09:07:00 | Test1 | SubTest1 | 1        |
9   | 01/01/2014 | 09:08:00 | Test1 | SubTest1 | 0        |
10  | 01/01/2014 | 09:09:00 | Test1 | SubTest1 | 0        |
11  | 01/01/2014 | 09:11:00 | Test1 | SubTest1 | 0        |
12  | 01/01/2014 | 09:12:00 | Test1 | SubTest1 | 0        |
13  | 01/01/2014 | 09:13:00 | Test1 | SubTest1 | 0        |
14  | 01/01/2014 | 09:14:00 | Test1 | SubTest1 | 1        |

如果我想知道要达到三次销售需要多少次电话,我的查询最初会返回5.我想做的是检查整个表并返回平均值 - 在这种情况下为7。

到目前为止,请参阅下面的查询:

WITH CTE AS
(
  SELECT UID, NAME1, SUBNAME1,
  COUNT(CASE WHEN SUCCESS = 1 THEN 1 ELSE NULL END) 
  OVER (ORDER BY UID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
      AS RunningTotal
  FROM dev.dbo.t1
  WHERE Name1 = 'Test1'
  AND Subname1 = 'SubTest1'
)
SELECT count(*)+1 AS [Count]
FROM CTE
WHERE RunningTotal < 3

感谢任何帮助。我正在使用Microsoft SQL Server 2008 R2(SP1) - 10.50.2500.0(X64)

由于

1 个答案:

答案 0 :(得分:0)

如果您希望平均呼叫次数达到3,我认为您可以只计算数据库中的行数,即成功次数。该比率是每次成功的平均呼叫次数。这个值的三倍是三次成功的平均值。

select count(*) as NumCalls, sum(Success) as Success,
       3.0 * count(*) / sum(Success) as AvgPer3
from dev.dbo.t1 t1;

这应该非常接近你想要的。如果你想要取得成功或取得第三次成功,可能会有一些小的调整。