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

时间:2018-09-08 15:23:12

标签: 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升至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

帮助表示感谢:)

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;

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

答案 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

demo on sqlfiddle

答案 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 

注意,您使用价格作为字符串