我有一个带有以下数据的sql表交易
id| value | price
1| 0.1 |1
2| 0.5 |2
3| 0.9 |2
4| 0.3 |2
如何进行SQL查询,以使价格2的ID升至id的条目总数限制为0.9。例如:-
Select Count of id FROM trade WHERE sum(value) <= 0.9 and price = '2'
结果应为
3
因为总共有3个条目,ID为2,3,4,值0.5,0.9,0.3,价格为2。它们的总和是1.7,大于0.9,但如果我们取0.5和0.3,则它们合计为0.8,小于0.9。因此结果应为3,因为它至少包含0.9的价格和价格2。
也可以通过顺序获取最后一个和第一个最高值的结果ID。
所以看起来像:-
4
2
3
帮助表示感谢:)
答案 0 :(得分:1)
您可以通过使用临时SQL变量来实现此目的,该变量存储部分和和已用行数。请注意,有两个SQL语句:
SET @tempsum := 0, @rowscount := 0;
SELECT MIN(tempcount) FROM
(SELECT
(@rowscount := @rowscount + 1) AS tempcount,
(@tempsum := @tempsum + value) AS tempsum
FROM trade WHERE
price='2'
ORDER BY value
) AS partialsums
WHERE tempsum>=0.9;
这样,部分和仅建立一次。没有变量,您将需要构建另一个子查询,该子查询将构建多个部分和。
这里是SQL提琴:http://sqlfiddle.com/#!9/38fc2/11/1
另请参阅:Create a Cumulative Sum Column in MySQL
您还可以使用变量来存储所涉及的ID,即:
SET @tempsum := 0, @rowscount := 0, @ids := '';
SELECT MIN(tempcount), tempids FROM
(SELECT
(@tempsum := @tempsum + value) AS tempsum,
(@rowscount := @rowscount + 1) AS tempcount,
(@ids := concat(@ids, ' ', id)) AS tempids
FROM trade WHERE
price='2'
ORDER BY value
) AS partialsums
WHERE tempsum>=0.9;
答案 1 :(得分:1)
select id from
(select id, if(not(@sum > 0.9), 1, 0) mark, (@sum:=@sum+value) as sum
from trade cross join (select @sum:=0) s
where price=2 order by value asc) t
where mark =1
内部查询对累积的总和和加法字段mark
进行计数,而总和小于one
,而总和较小,超过0.9时变为零。由于它在下一步工作,因此它会收集总和超过限制的第一行。
内部选择的结果
id mark sum
4 1 0.30000001192092896
2 1 0.800000011920929
3 1 1.699999988079071
现在,在外部查询中,您只需要选择mark
等于1的行,结果就是4,2,3
答案 2 :(得分:0)
如果需要计数不同的ID值,则可以使用count(distinct id)
,然后检查是否有汇总结果(sum()..),您应该使用hading而不是where
Select Count(distinct id )
FROM trade
where price = 2
HAVING sum(value) <= 0.9
如果您希望ID的行的计数不为null,则可以使用count(id)
Select Count(id )
FROM trade
where price = 2
HAVING sum(value) <= 0.9
注意,您使用价格作为字符串