Mysql 选择总和大于或等于给定阈值的最小行数

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

我有一个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.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