SQL:其中一列的总和满足条件
在[MYTABLE]选择行:SQL:其中一列的总和满足条件
[id] AS INT -- UNIQUE
[price] AS MONEY
在其上由[ID]订购了一套,我需要选择那些[ID] s其中总和的[价格]满足一些条件
例如:
[id] [price]
1 2.0
2 4.7
3 3.2
4 2.8
5 6.2
6 1.5
7 4.2
8 3.3
对于给定数目'10 0.0' :
[id] [price] [r_total]
1 2.0 2.0
2 4.7 6.7
3 3.2 9.9
4 2.8 12.7 <-- here the criteria meets for 10.0
5 6.2 18.9
6 1.5 20.4
7 4.2 24.6
8 3.3 27.9
期望的结果是一组[ID] S:
[id]
1
2
3
4
的问题是使用运行总计解决,但主要问题是,我想避免计算运行总计为所有该组第一,然后找到标准符合的点,原因是该表包含超过100.000.000行,并且与[价格]总和相比的给定数量通常非常小(例如:1250.14),而预期的结果几乎没有丰富的100-150行!
是否有任何其他方式来计算并获得所需的行而不会干扰这些100.000.000行?
请尝试使用CTE:
;with CTE1 as
(
SELECT
ID, Price, Price as CUM_SUM
FROM YourTable
WHERE ID=1
UNION ALL
SELECT
c.ID, c.Price, c.Price+c1.CUM_SUM as CUM_SUM
FROM CTE1 c1 INNER JOIN
YourTable c on c.ID=c1.ID+1
WHERE 10 >c1.CUM_SUM
)
select * from CTE1
似乎没有办法解决这个问题没有总结价格。您要么在插入时存储运行总数(使用更多的存储空间并稍微放缓插入),要么使用子查询或视图(非常非常慢)来强制计算每个查询的运行总数。
如果您最终使用运行总计字段,请确保为插入使用事务,这样数据不会处于杂乱状态。如果两个新记录几乎同时插入,则可能会发生这种情况。
运行总列不可能使用,因为每次计算可能从不同的“高度”开始(基于[myDate]列),现在我使用“非常非常非常慢”的方式,它是真的很慢现在我试图用一种循环方法来实现另一种方法,并且我认为它会比现在使用的方法快得多非常快。 – armen 2013-02-14 07:54:22
我真的很喜欢使用递归的答案......它是 非常聪明。只需从SQL服务器中获取一些数据,并且如果与服务器的连接速度很快,则在客户端分析数据可能会更好。 – 2013-02-14 15:52:52
你不会相信这一点,但所涉及行#长(例如,一个大的运行总阈值),是迄今为止最有效的方法解决这是一个CURSOR!是的,真的! Check it out here。顺便说一句,递归CTE方法可以运行到递归级别限制(如堆栈溢出)。
你是对的!但是我会坚持使用递归方法,因为这个计算所涉及的行数接近30-40! – armen 2013-02-18 17:36:56
它应该是'12.7'而不是'11.7'吧? – 2013-02-14 07:34:29
是的你是对的 - 速度杀死:( – armen 2013-02-14 07:44:34
为什么-1?我问了什么问题?请解释一下。我正在努力做所有事情。 – armen 2013-02-14 08:47:10