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

gkn4icbw  于 2021-06-19  发布在  Mysql
关注(0)|答案(3)|浏览(270)

我有一个sql表,其中包含以下数据

id| value | price
 1| 0.1   |1
 2| 0.5   |2
 3| 0.9   |2
 4| 0.3   |2

如何进行sql查询,以便按id升序获得price 2的总值限制为0.9的条目数。为了example:-

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

感谢您的帮助:)

14ifxucb

14ifxucb1#

如果需要distinct id值的计数,可以使用count(distinct id)
并检查聚合结果(sum()..),您应该使用having而不是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

注意:您使用的是price作为字符串

cngwdvgl

cngwdvgl2#

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时变为零。因为它是在一步之后工作的,所以它会在sum超过限制的地方聚集第一行。
内部选择的结果

id   mark   sum
4    1      0.30000001192092896
2    1      0.800000011920929
3    1      1.699999988079071

现在在外部查询中,您只需要使用 mark 等于1。结果是 4,2,3 sqlfiddle演示

k10s72fa

k10s72fa3#

可以通过使用存储部分和和和已用行数的临时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/#!2011年9月38日
另请参阅:在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;

参见小提琴:http://sqlfiddle.com/#!9/38fc2/33/0号

相关问题