Sql server 多行计算SQL Server

Sql server 多行计算SQL Server,sql-server,tsql,Sql Server,Tsql,我有一张桌子: UNIQUE KEY ID Clicks INSERTDATE 1 100001 10 2011-05-14 00:00:00.000 2 100001 20 2011-05-13 00:00:00.000 3 100001 30 2011-05-18 00:00:00.000 4 100002 10 2011-05-20 00:00:00.00

我有一张桌子:

UNIQUE KEY ID      Clicks    INSERTDATE
 1         100001   10     2011-05-14 00:00:00.000
 2         100001   20     2011-05-13 00:00:00.000
 3         100001   30     2011-05-18 00:00:00.000
 4         100002   10     2011-05-20 00:00:00.000
 5         100002   15     2011-05-24 00:00:00.000
 6         100002   10     2011-05-05 00:00:00.000
我有一个点击的阈值,比如说20次

我需要编写一个T-SQL,它应该删除不满足每个ID的累计点击总数阈值的点击

因此,对于上述示例ID“100001”,累计点击次数为60次(10+20+30),但由于阈值为20,最后一条记录即点击值为30的记录应从结果中删除。 但是,即使第二条记录的总和大于我的阈值(10+20),也应包括该记录

编辑:

需要应用的另一个主要规则是,必须在执行任何计算之前对INSERTDATE进行排序


任何帮助都将不胜感激。

我希望我正确地阅读了问题。似乎太简单了:

SELECT ID, SUM(Clicks) AS Clicks 
FROM t1
WHERE Clicks <= 20                 -- <== this is your threshold
GROUP BY ID
选择ID,将(点击次数)相加为点击次数
从t1开始

单击此处我希望我正确阅读了问题。似乎太简单了:

SELECT ID, SUM(Clicks) AS Clicks 
FROM t1
WHERE Clicks <= 20                 -- <== this is your threshold
GROUP BY ID
选择ID,将(点击次数)相加为点击次数
从t1开始

单击此处如果我正确理解了问题,您希望对给定Id的RunningTotal进行筛选,如下所示:

select c1.*
from ClickTable c1
outer apply (
  select sum(Clicks) as RunningTotal
  from ClickTable 
  where pk < c1.pk
    and id = c1.id
) c2
where isnull(RunningTotal, 0) <= 20

其中单击

Running sample:如果我正确理解了这个问题,您希望对给定Id的RunningTotal进行筛选,如下所示:

select c1.*
from ClickTable c1
outer apply (
  select sum(Clicks) as RunningTotal
  from ClickTable 
  where pk < c1.pk
    and id = c1.id
) c2
where isnull(RunningTotal, 0) <= 20

其中单击

我想他想要20@Greg也抓到了,并修复了。谢谢。抱歉,但这不是实际的要求,如果你在上面检查@w0lf所做的与要求的非常接近。我想他想要20@Greg也抓到了,并修复了。谢谢。抱歉,但这不是实际要求,如果您检查以上@w0lf所做的与要求的非常接近。+1如果OP没有递增PK,则可以应用带有行数的中间排名。很好!我们是否可以在点击时在子查询中应用ORDER BY,否则,如果20是第一个,它将忽略其余的?@nonnb Right!我没有想到这一点。@MurtazaMandvi当前的子选择汇总了所有PK值低于当前值的记录,因此我认为不需要任何
orderby
子句;运行总数按下列顺序计算:PK@MurtazaMandvi如果20是第一个,它不会忽略其余的,因为我使用了
+1,如果OP没有递增的PK,那么可以使用ROW_NUMBER.Nice进行中间排名!我们是否可以在点击时在子查询中应用ORDER BY,否则,如果20是第一个,它将忽略其余的?@nonnb Right!我没有想到这一点。@MurtazaMandvi当前的子选择汇总了所有PK值低于当前值的记录,因此我认为不需要任何
orderby
子句;运行总数按下列顺序计算:PK@MurtazaMandvi如果20是第一个,它不会忽略其余的,因为我使用了

where Clicks < c1.Clicks