SQL - 达到给定值所需的条目数

时间:2014-03-31 19:15:00

标签: sql

我需要找到达到给定值所需的记录数。我有一个以下格式的表格:

    ID  Name        Time    Time 2
    1   Campaign 1  7       100
    2   Campaign 3  5       165
    3   Campaign 1  3       321
    4   Campaign 2  610     952
    5   Campaign 2  15      13
    6   Campaign 2  310     5
    7   Campaign 3  0       3
    8   Campaign 1  0       610
    9   Campaign 1  1       15
    10  Campaign 1  54      310
    11  Campaign 3  4       0
    12  Campaign 2  23      0
    13  Campaign 2  8       1
    14  Campaign 3  23      1
    15  Campaign 3  7       0
    16  Campaign 3  5       5
    17  Campaign 3  2       66
    18  Campaign 3  100     7
    19  Campaign 1  165     3
    20  Campaign 1  321     13
    21  Campaign 1  952     5
    22  Campaign 1  13      3
    23  Campaign 2  15      610
    24  Campaign 2  0       15
    25  Campaign 1  100     310
    26  Campaign 2  165     0
    27  Campaign 3  321     0
    28  Campaign 3  952     1
    29  Campaign 3  0       1
    30  Campaign 3  5       0

我想知道在Time1 + Time2总数等于或大于给定数字之前,有多少“广告系列1”条目。

例如,广告系列1达到1400的结果应为5。

如果我没有足够清楚地解释这一点,我会道歉 - 这个概念目前仍然有点混乱。

由于

2 个答案:

答案 0 :(得分:0)

在SQL Server 2012中,您可以使用以下命令获取行:

select t.*
from (select t.*, sum(time1 + time2) over (partition by name order by id) as cumsum
      from table t
     ) t
where cumsum >= @VALUE and (cumsum - (time1 + time2)) < @VALUE;

您可以使用以下方式获取计数:

select name, count(*)
from (select t.*, sum(time1 + time2) over (partition by name order by id) as cumsum
      from table t
     ) t
where (cumsum - (time1 + time2)) < @VALUE
group by name;

如果您不使用SQL Server 2012,则可以使用相关子查询执行累积求和:

select name, count(*)
from (select t.*,
             (select sum(time1 + time2) 
              from table t2
              where t2.name = t.name and
                    t2.id <= t.id
             ) as cumsum
      from table t
     ) t
where (cumsum - (time1 + time2)) < @VALUE
group by name;

答案 1 :(得分:0)

计算运行总计的递归CTE应该有效:

;WITH CTE AS
(
  SELECT id,
         name,
         SUM([time]+[time 2])
    OVER (ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
          AS RunningTotal
  FROM Table1
  WHERE name = 'Campaign 1'
)
SELECT count(*)+1 AS [Count]
FROM CTE
WHERE RunningTotal < 1400

请注意,我在计数中添加了1,因为查询计算了达到但不包括1400所需的行数。逻辑指示下一行将值推到1400以上。