Mysql 选择总和大于或等于给定阈值的最小行数
我有一个sql表,其中包含以下数据Mysql 选择总和大于或等于给定阈值的最小行数,mysql,sql,Mysql,Sql,我有一个sql表,其中包含以下数据 id| value | price 1| 0.1 |1 2| 0.5 |2 3| 0.9 |2 4| 0.3 |2 如何进行SQL查询,以使价格2按id升序的条目总数限制为0.9。例如:- Select Count of id FROM trade WHERE sum(value) <= 0.9 and price = '2' 因为总共有3个条目id为2,3,4,值为0.5,0.9,0.3,价格为2。它们的总和是1.7,大于0
id| value | price
1| 0.1 |1
2| 0.5 |2
3| 0.9 |2
4| 0.3 |2
如何进行SQL查询,以使价格2按id升序的条目总数限制为0.9。例如:-
Select Count of id FROM trade WHERE sum(value) <= 0.9 and price = '2'
因为总共有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
感谢帮助:)如果您需要不同ID值的计数,可以使用计数(不同ID) 检查聚合结果(sum()…)时,应该使用having而不是where
Select Count(distinct id )
FROM trade
where price = 2
HAVING sum(value) <= 0.9
选择计数(不同id)
来自贸易
其中价格=2
拥有sum(value)可以通过使用一个临时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小提琴:
另见:
您也可以使用变量来存储所涉及的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
,而总和较小,超过0.9时变为零。由于它在一个步骤之后工作,所以它会在sum超过限制的位置收集第一行
内部选择的结果
id mark sum
4 1 0.30000001192092896
2 1 0.800000011920929
3 1 1.699999988079071
现在,在外部查询中,您只需要选择带有标记等于1的行。结果是4,2,3
不清楚。。。你想用price=2
和值Yes来计算物品的数量吗。但是在您的示例中,在selectcount(*)FROM trade WHERE value中,您指出结果应该是3
。应该改为2
?因为两个值之和为0.9。你能解释一下这一点吗?3个值之和>=9,是的,这就是我想要的。我希望主值(0.9)应该得出y个条目中x值的总和,其中x>0.9,但是当我们拆分x时,x-1条目应该<0.9选择计数(*)来自交易t1,其中t1.id错误:-组函数的使用无效错误:-“having clause”查询中的未知列“price”已运行,但结果为nothing使用数字代替字符串进行更新。再次,结果为nothing。请尝试sqlfiddle并尝试它是否工作并提供链接。结果:-COUNT(*)0
:(aaaahsh终于成功了,但是有没有办法同时查看id?当然,fiddle-see-link请看这里它几乎有问题,但在这个问题中我想其中price=2
对不起,我不够仔细;请查看更新的查询和fiddle。也尝试了其中tempsum>=0.3
-返回1,tempsum>=0.4
-返回2,以此类推,WHERE tempsum>=2
-返回nullPerfect,假设还有一个字段类型具有buy或sell,是否有方法从WHERE type='buy'中进行选择?还有一种方法可以获取除last之外的ID?1)您可以将WHERE子句WHERE price=2
扩展到您想要的范围2)交换字段顺序在选择列表中,或者只是不在结果列表中使用最后一个id,所以让我们假设结果为45,5953434如何仅获取3434或删除它您将获得一个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;
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
id mark sum
4 1 0.30000001192092896
2 1 0.800000011920929
3 1 1.699999988079071